2011-02-25 4 views

답변

2

네이티브 명령을 실행 하시겠습니까? like whoami

1

이것을 확인하십시오 : get login username in java.

+1

'-Duser.name = root' 조심해서 원하는대로 설정할 수 있습니다. –

+0

'user.name'을 확인 하던지,'whoami'의 결과를 파싱하든간에 사용자 이름을 퍼지 할 수 있습니다. 액세스 제어를 위해이 기능을 사용한다면 다소 망가질 수 있습니다. – cHao

2

당신은

Process p = Runtime.getRuntime.exec("whoami") 

메서드를 호출 할 수 있습니다. 그런 다음 의 stdout을 처리하여 명령 출력을 읽을 수 있습니다.

+0

경로를 변경하여'whoami'가 원하는 것을 반환 할 수 있습니다. '/ usr/bin/whoami'가 더 나은 선택 일 수 있습니다. –

+0

'Runtime.getRuntime.exec'의 인자는 프로그램 이름인가 아니면 쉘 명령어인가? 왜냐하면 쉘 명령이라면 명령 행에서 Java 응용 프로그램을 실행하는 사용자가 환경 변수를 조정하여 실제로'/ usr/bin/whoami '가 의미하는 것을 변경할 수 있기 때문입니다. IE : $ IFS를 슬래시를 포함하도록 설정하고, $ PATH에 현재 디렉토리를 추가 한 다음, 거기에'usr' 프로그램을 넣으십시오. – cHao

+0

어느 쪽이든,'whoami'의 출력에 의존하는 것은 보안상의 목적에 실제로는 적합하지 않습니다. 예를 들어 설치 프로그램에서 편리함 확인으로 좋을 것입니다. (설치 프로그램을 반쯤 설치하지 않고 적절한 오류 메시지를 표시 할 수 있도록) 또는 루트 권한없이 중단되는 다른 프로그램입니다. 그러나 무언가에 대한 접근을 허용 *하는 것은 나쁜 생각이되는 여러 가지 방법으로 전복 될 수 있습니다. – cHao

0

가장 좋은 방법은

Process p = Runtime.getRuntime.exec("groups `whoaim`"); 

을 실행하고 그룹 호출 루트를 얻기 위해 문자열을 구문 분석하는 것입니다. JVM 프로세스는 루트가 아니라 조정자이지만 사용자는 루트 그룹에 속할 수 있고 루트 권한을 가질 수 있습니다.

+0

필자가 본 거의 모든 Linux 시스템에서 실제 루트 사용자 만 루트 권한을가집니다. 루트 그룹은 일반적으로 실제 액세스를 고려하지 않고 * 잠재적 * 액세스를 고려합니다. 즉 누군가가 * 루트 권한을 얻는 명령을 실행할 수는 있지만 자동으로 * 소유하지는 않습니다. – cHao

7
Process p = Runtime.getRuntime().exec("id -u") 

(그것을 변경 드문 있지만) 시스템에서 "루트"사용자가 root를 호출하지 못할 수도 있으며, 이는 다른 사용자 이름에 별칭을 수도 있습니다. 현재 사용자가 루트와 같은 경우 출력은 0이됩니다.

+1

루트 사용자 이름을 변경하는 것은 가능하지만 '루트'라는 이름이 하드 코딩 된 여러가지 내용이 손상됩니다. 이런 것들 중에 주목할만한 것은'su'입니다. 사용자 이름없이 실행하면'su root'와 같고 사용자 "root"가 존재하지 않는다고 불평합니다. 나는 이것을 한 번 시도하고 곧 사용자 이름을 다시 변경했습니다. :) – cHao

6

쉬운. 그냥

System.getProperty("user.name") 
+0

[다른 SO 답변]에서 지적한대로 보안되지 않을 수 있습니다 (http : // stackoverflow.com/a/2290392/2032064) – Mifeet

+0

@Mifeet 동의합니다. 이것은 속일 수 있습니다. 그러나 개발자가 의도 한 사용자와 의도 된 소프트웨어 환경을 알고 있다면이 방법이 유용 할 수 있습니다. –

0
String userName = System.getProperty("user.name"); 
Process p = Runtime.getRuntime().exec("groups " + userName); 
String output = read(p.getInputStream()); 
String error = read(p.getErrorStream()); 

를 사용하고 여기에 읽기 기능입니다 :

public static String read(InputStream input) throws IOException { 
    try (BufferedReader buffer = new BufferedReader(new InputStreamReader(input))) { 
     return buffer.lines().collect(Collectors.joining("\n")); 
    } 
} 

그냥 "또 다른"수정 솔루션.

관련 문제