답변
네이티브 명령을 실행 하시겠습니까? like whoami
이것을 확인하십시오 : get login username in java.
당신은
Process p = Runtime.getRuntime.exec("whoami")
메서드를 호출 할 수 있습니다. 그런 다음 의 stdout을 처리하여 명령 출력을 읽을 수 있습니다.
경로를 변경하여'whoami'가 원하는 것을 반환 할 수 있습니다. '/ usr/bin/whoami'가 더 나은 선택 일 수 있습니다. –
'Runtime.getRuntime.exec'의 인자는 프로그램 이름인가 아니면 쉘 명령어인가? 왜냐하면 쉘 명령이라면 명령 행에서 Java 응용 프로그램을 실행하는 사용자가 환경 변수를 조정하여 실제로'/ usr/bin/whoami '가 의미하는 것을 변경할 수 있기 때문입니다. IE : $ IFS를 슬래시를 포함하도록 설정하고, $ PATH에 현재 디렉토리를 추가 한 다음, 거기에'usr' 프로그램을 넣으십시오. – cHao
어느 쪽이든,'whoami'의 출력에 의존하는 것은 보안상의 목적에 실제로는 적합하지 않습니다. 예를 들어 설치 프로그램에서 편리함 확인으로 좋을 것입니다. (설치 프로그램을 반쯤 설치하지 않고 적절한 오류 메시지를 표시 할 수 있도록) 또는 루트 권한없이 중단되는 다른 프로그램입니다. 그러나 무언가에 대한 접근을 허용 *하는 것은 나쁜 생각이되는 여러 가지 방법으로 전복 될 수 있습니다. – cHao
가장 좋은 방법은
Process p = Runtime.getRuntime.exec("groups `whoaim`");
을 실행하고 그룹 호출 루트를 얻기 위해 문자열을 구문 분석하는 것입니다. JVM 프로세스는 루트가 아니라 조정자이지만 사용자는 루트 그룹에 속할 수 있고 루트 권한을 가질 수 있습니다.
필자가 본 거의 모든 Linux 시스템에서 실제 루트 사용자 만 루트 권한을가집니다. 루트 그룹은 일반적으로 실제 액세스를 고려하지 않고 * 잠재적 * 액세스를 고려합니다. 즉 누군가가 * 루트 권한을 얻는 명령을 실행할 수는 있지만 자동으로 * 소유하지는 않습니다. – cHao
Process p = Runtime.getRuntime().exec("id -u")
(그것을 변경 드문 있지만) 시스템에서 "루트"사용자가 root
를 호출하지 못할 수도 있으며, 이는 다른 사용자 이름에 별칭을 수도 있습니다. 현재 사용자가 루트와 같은 경우 출력은 0
이됩니다.
루트 사용자 이름을 변경하는 것은 가능하지만 '루트'라는 이름이 하드 코딩 된 여러가지 내용이 손상됩니다. 이런 것들 중에 주목할만한 것은'su'입니다. 사용자 이름없이 실행하면'su root'와 같고 사용자 "root"가 존재하지 않는다고 불평합니다. 나는 이것을 한 번 시도하고 곧 사용자 이름을 다시 변경했습니다. :) – cHao
쉬운. 그냥
System.getProperty("user.name")
[다른 SO 답변]에서 지적한대로 보안되지 않을 수 있습니다 (http : // stackoverflow.com/a/2290392/2032064) – Mifeet
@Mifeet 동의합니다. 이것은 속일 수 있습니다. 그러나 개발자가 의도 한 사용자와 의도 된 소프트웨어 환경을 알고 있다면이 방법이 유용 할 수 있습니다. –
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"));
}
}
그냥 "또 다른"수정 솔루션.
- 1. 유닉스에서 프로그램을 실행 한 사용자가 루트인지 확인하십시오.
- 2. 사용자가 Facebook 페이지를 좋아하는지 확인합니다.
- 3. 웹 응용 프로그램에서 사용자가 시작한 백그라운드 프로세스
- 4. Java 응용 프로그램에서 로거에 액세스
- 5. Rails 3가 적용된 캔버스 응용 프로그램 : 사용자가 팬인지 확인합니다.
- 6. 사용자가 Facebook에 캔버스 응용 프로그램을 허용하지 않는지 확인합니다. C# MVC
- 7. Java 응용 프로그램에서 JSR82 사용
- 8. Java 응용 프로그램에서 데이터베이스 사용
- 9. Java 응용 프로그램에서 AJAX를 사용합니다.
- 10. Java 응용 프로그램에서 Growl 구현
- 11. Java 응용 프로그램에서 AutoIt 사용
- 12. Java 응용 프로그램에서 트윗 만들기
- 13. java 응용 프로그램에서 iwconfig를 Excecute
- 14. Java 응용 프로그램에서 Windows 전환
- 15. Java 응용 프로그램에서 트랩 전송
- 16. Java 응용 프로그램에서 Cygwin 호출
- 17. 사용자가 이미 cfloginuser를 통해 로그인했는지 확인합니다.
- 18. X가 실행 중이고 응용 프로그램에서 사용 가능한지 확인합니다.
- 19. Java 데스크톱 응용 프로그램에서 응용 프로그램 속성로드
- 20. jre가 설치되어 있는지 확인합니다.
- 21. Java 응용 프로그램에서 (JRuby를 통해) Java 응용 프로그램에서 ERB 템플릿을 사용하기위한 참조
- 22. 파일이 파이썬에서 setuid 루트인지 확인하십시오.
- 23. Java 응용 프로그램에서 Java 외부 콘솔 응용 프로그램 시작
- 24. Java - JList에 ANYTHING이 선택되어 있는지 확인합니다.
- 25. Java 웹 시작 응용 프로그램에서 값 반환
- 26. 사용자가 앱이 자신의 위치를 사용하도록 허용하는지 확인합니다.
- 27. 사용자가 쿠키 값을 수동으로 변경했는지 확인합니다.
- 28. Java CLI 응용 프로그램에서 암호 마스킹
- 29. Java 응용 프로그램에서 .exe 파일 실행
- 30. Java 응용 프로그램에서 프로세스를 제대로 종료 할 수 있습니까? Java 응용 프로그램에서
'-Duser.name = root' 조심해서 원하는대로 설정할 수 있습니다. –
'user.name'을 확인 하던지,'whoami'의 결과를 파싱하든간에 사용자 이름을 퍼지 할 수 있습니다. 액세스 제어를 위해이 기능을 사용한다면 다소 망가질 수 있습니다. – cHao