2009-06-18 51 views
13

试图写能够运行UNIX命令作为不同UNIX用户的Java程序。我有用户的密码,我知道我要运行的命令,但该命令必须按该用户运行 - 所以我必须先登录,该用户。运行UNIX命令为不同的用户,从Java

例如:假设我们有一个用户,吉姆,谁愿意看到什么在bob的主目录,(无论何种原因)吉姆有权访问而鲍勃不执行LS。 我们目前以bob的身份登录。以下是我们可以做的事情:

[email protected]$ su jim && ls ~bob 

问题是,我们得到提示输入jim的密码。由于这是从Java程序运行的,即

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

我们得到提示输入jim的密码并挂断。 我们知道吉姆的密码。但是,我无法输入。

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

[email protected]$ ssh [email protected] "ls ~bob" 

但这也因为我没有权限设置密码的SSH不起作用。

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

有什么建议吗?

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

+0

您是否能够在不使用第三方库的情况下找到解决方法,如果可以,请分享一下? – HyperioN 2017-07-12 05:36:57

回答

6

问题已解决。使用JSch(http://www.jcraft.com/jsch/)以已知的用户名和密码登录到服务器,并执行命令。非常感谢您的建议!

+0

请在这里添加一个例子。 – vijendra 2016-12-16 10:13:08

7

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

+0

这不是一个解决方案。不幸的是,我无法修改系统 - 包括安装sudo。 – 2009-06-18 14:07:23

+2

然后您需要切换主机。 – 2009-06-18 14:10:17

+0

同意Andrew。如果你的主机不允许你使用pubkey SSH,甚至不能安装“sudo”,那么你可能会提出任何关于你的“su”方案的想法,虽然也许可能,你的主机不允许无论如何,你必然会遇到麻烦。找到允许sudo的托管商,这是唯一明智的解决方案。 – DevSolar 2009-06-18 15:08:45

0

可能的Java实现的期待?当谷歌搜索时出现ExpectJ,但我无法找到有关在1.4.2下运行的任何文档。

+0

这可能是一个解决方案。谢谢你的提示。 – 2009-06-18 14:24:32

+0

那么,ExpectJ看起来应该可以工作 - 设法复制和构建依赖关系。问题是,ExpectJ使用了StringBuilder,直到1.5才实现。有什么建议么? – 2009-06-18 14:53:13

+0

您可以询问ExpectJ人员是否有旧版本(sourceforge上没有一个版本)。如果唯一的问题是StringBuilder,你应该可以自己修改代码。 – 2009-06-18 15:38:31

0

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

使用getInputStream()并写出你的密码。

su jim -c ls ~Bob 
-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(); 
+0

谢谢,但它没有奏效。我以前尝试过类似的方法,但结果大致相同。 – 2009-06-18 14:19:26

-1

我不知道这样的代码:

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

将在shell执行,评估& &需要的,那就是一个shell命令(/ bin/sh)。你应该通过su命令行来传递命令“ls〜bob”。例如:

su jim -c 'ls ~bob' 
+0

与上述答案相同。 – 2009-06-18 14:22:28

+0

然后SSH imho是唯一可行的选项 – dfa 2009-06-18 14:29:29