从Java运行UNIX命令作为不同的用户

时间:2009-06-18 14:01:59

标签: java unix ssh passwords aix

尝试编写能够以不同的UNIX用户身份运行UNIX命令的Java程序。我有用户的密码,我知道我想要运行的命令,但该命令必须以该用户身份运行 - 所以我必须先以该用户身份登录。

例如:假设我们有一个用户,jim,谁想要查看bob的主目录中的内容,以及(无论出于何种原因)jim可以访问执行ls而bob则没有。 我们目前以bob身份登录。这是我们(可以)做的事情:

bob@host$ su jim && ls ~bob

问题是,我们会收到jim密码的提示。因为它是从Java程序运行的,即

Process p = Runtime.getRuntime().exec("su jim && ls ~bob");

我们收到jim密码的提示并挂断了。 我们知道jim的密码。但是,我无法输入它。

此外,我们不能使用Expect脚本(没有安装它),我们也不能成为超级用户。我也考虑使用SSH来试试这个,因为我们可以从技术上做到

bob@host$ ssh jim@host "ls ~bob"

但由于我没有设置无密码SSH的权限,因此也无效。

我最后的努力是尝试使用SSH库来实现Java,因为密码可供Java程序使用,我可以用它登录(并执行正确的命令)。但是因为我要在同一台主机上运行,​​所以看起来有点过分了。

有什么建议吗?

P.S:Java版本1.4.2,无法升级; AIX UNIX 5.3。

6 个答案:

答案 0 :(得分:7)

安装了sudo,让用户运行在/ etc / sudoers中为相关命令输入的Java程序,并使用sudo -u jim ls ~bob

答案 1 :(得分:6)

问题解决了。使用JSch(http://www.jcraft.com/jsch/)以已知的用户名和密码SSH连接到服务器,并执行命令。谢谢大家的建议!

答案 2 :(得分:0)

可能是Expect的java实现?谷歌搜索时出现ExpectJ,但我找不到有关1.4.2下运行的任何文档。

答案 3 :(得分:0)

您是否尝试重定向sudo命令输入并写入该命令。我有一段时间没有使用Java,但我相信有一种方法可以获取输入流并写入它。您可以使用它来写密码,后跟新行,sudo或su应该接受密码。

使用getInputStream()并将密码写入其中。

su jim -c ls ~Bob

答案 4 :(得分:-1)

也许这会奏效:

Process process = Runtime.getRuntime().exec("su jim && ls ~bob");

OutputStream standardInput = process.getOutputStream();
Writer standardInputWriter = new OutputStreamWriter(standardInput);
standardInputWriter.write("password\n");
standardInputWriter.close();

答案 5 :(得分:-1)

我不确定这段代码:

Process p = Runtime.getRuntime().exec("su jim && ls ~bob");

将在shell中执行,需要评估&&&,这是一个shell命令(/ bin / sh)。你应该通过su的命令行swith传递命令“ls~bob”。类似的东西:

su jim -c 'ls ~bob'