UNIX를 실행하는 것은 Java와 다른 사용자로 명령합니다
문제
UNIX 명령을 다른 UNIX 사용자로 실행할 수있는 Java 프로그램을 작성하려고합니다. 사용자의 비밀번호가 있고 실행하려는 명령을 알고 있지만 명령은 해당 사용자로 실행해야하므로 먼저 사용자로 로그인해야합니다.
예를 들어 : 우리는 Bob의 홈 디렉토리에 무엇이 있는지보고 싶어하는 사용자 인 Jim이 있다고 말하며 (어떤 이유로 든 Jim은 LS를 실행할 수있는 반면 Bob은 그렇지 않습니다. 우리는 현재 Bob로 로그인되었습니다. 우리가 할 수있는 일은 다음과 같습니다.
bob@host$ su jim && ls ~bob
문제는 Jim의 비밀번호를 촉진한다는 것입니다. 이것은 Java 프로그램에서 실행되므로, 즉
Process p = Runtime.getRuntime().exec("su jim && ls ~bob");
우리는 Jim의 비밀번호를 자극하고 끊었습니다. 우리는 Jim의 암호를 알고 있습니다. 그러나 나는 그것을 입력 할 수 없습니다.
또한, 우리는 기대 스크립트를 사용할 수 없으며 (설치하지 않음) 슈퍼업자가 될 수 없습니다. 또한 기술적으로 할 수 있기 때문에 SSH를 사용하여 이것을 시도했습니다.
bob@host$ ssh jim@host "ls ~bob"
그러나 암호가없는 SSH를 설정할 권한이 없기 때문에 이것은 작동하지 않습니다.
마지막 도랑 노력은 Java 프로그램에 비밀번호를 사용할 수 있으므로 Java 용 SSH 라이브러리를 사용하는 것입니다. 이에 따라 로그인하고 적절한 명령을 실행할 수 있기 때문입니다. 그러나 나는 같은 호스트에서 실행할 예정이므로 과잉처럼 보입니다.
제안이 있습니까?
추신 : Java 버전 1.4.2, 업그레이드 할 수 없습니다. AIX UNIX 5.3.
해결책 2
문제 해결됨. 중고 JSCH (http://www.jcraft.com/jsch/) 알려진 사용자 이름과 비밀번호로 서버에 ssh로, 명령을 실행하십시오. 귀하의 제안에 감사드립니다!
다른 팁
Sudo를 설치하고, Java 프로그램을 실행하는 사용자가 문제의 명령에 대해 /etc /sudoers에 입력하고 사용하도록하십시오. sudo -u jim ls ~bob
.
아마도 기대의 Java 구현일까요? 예상 인터넷 검색 할 때 나오지만 1.4.2 미만의 실행에 관한 문서를 찾을 수 없었습니다.
Sudo 명령 입력을 리디렉션하고 작성해 보았습니까? 나는 한동안 Java를 사용하지 않았지만 입력 스트림을 얻고 글을 쓸 수있는 방법이 있다고 생각합니다. 이를 사용하여 비밀번호를 작성한 다음 새 라인을 작성하고 Sudo 또는 SU가 암호를 수락해야합니다.
getInputStream ()을 사용하고 비밀번호를 작성하십시오.
su jim -c ls ~Bob
아마도 이것은 효과가있을 것입니다 :
Process process = Runtime.getRuntime().exec("su jim && ls ~bob");
OutputStream standardInput = process.getOutputStream();
Writer standardInputWriter = new OutputStreamWriter(standardInput);
standardInputWriter.write("password\n");
standardInputWriter.close();
이 코드는 확실하지 않습니다.
Process p = Runtime.getRuntime().exec("su jim && ls ~bob");
&&, 즉 쉘 명령 (/bin/sh)을 평가하는 데 필요한 쉘에서 실행됩니다. SU의 명령 줄을 통해 "ls ~ bob"명령을 전달해야합니다. 같은 것 :
su jim -c 'ls ~bob'