13

尝试编写能够以不同 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");

我们被提示输入吉姆的密码并挂断了电话。我们知道吉姆的密码。但是,我无法进入它。

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

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

但这也不起作用,因为我无权设置无密码 SSH。

我最后的努力是尝试使用 Java 的 SSH 库,因为密码可用于 Java 程序,并且我可以使用该密码登录(并执行正确的命令)。但是由于我将在同一台主机上运行,​​这似乎有点矫枉过正。

有什么建议么?

PS:Java版本1.4.2,无法升级;AIX UNIX 5.3。

4

6 回答 6

8

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

于 2009-06-18T14:05:45.750 回答
6

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

于 2009-06-18T16:30:45.423 回答
0

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

于 2009-06-18T14:09:27.553 回答
0

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

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

su jim -c ls ~Bob
于 2009-06-18T14:09:32.200 回答
-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();
于 2009-06-18T14:11:23.243 回答
-1

我不确定这段代码:

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

将在 shell 中执行,需要评估 &&,即 shell 命令 (/bin/sh)。您应该通过 su 的命令行开关传递命令“ls ~bob”。就像是:

su jim -c 'ls ~bob'
于 2009-06-18T14:18:31.747 回答