从 Java 以不同用户身份运行 UNIX 命令
题
尝试编写一个能够以不同的 UNIX 用户身份运行 UNIX 命令的 Java 程序。我有用户的密码,并且知道要运行的命令,但该命令必须以该用户身份运行 - 所以我必须首先以该用户身份登录。
例如:假设我们有一个用户 jim,他想查看 bob 的主目录中的内容,并且(无论出于何种原因)jim 有权执行 ls 而 bob 没有。 我们当前以 bob 身份登录. 。这是我们(可以)做的:
bob@host$ su jim && ls ~bob
问题是,系统提示我们输入吉姆的密码。由于这是从 Java 程序运行的,即
Process p = Runtime.getRuntime().exec("su jim && ls ~bob");
系统提示我们输入吉姆的密码,然后就挂断了。 我们知道吉姆的密码. 。但是,我无法输入。
此外,我们无法使用 Expect 脚本(未安装它)并且无法成为超级用户。我还研究过使用 SSH 来尝试这个,因为我们在技术上可以做到
bob@host$ ssh jim@host "ls ~bob"
但这也不起作用,因为我无权设置无密码 SSH。
我最后的努力是尝试使用 Java 的 SSH 库,因为密码可用于 Java 程序,并且我可以使用该密码登录(并执行正确的命令)。但由于我要在同一主机上运行,所以这似乎有点矫枉过正。
有什么建议么?
附: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
.
可能是 Expect 的 java 实现? 期待J 谷歌搜索时出现,但我找不到任何有关在 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");
将在 shell 中执行,需要评估 &&,即 shell 命令 (/bin/sh)。您应该通过 su 的命令行开关传递命令“ls ~bob”。就像是:
su jim -c 'ls ~bob'