我正在尝试使用Java 1.8和OS Solaris 11运行一个简单的命令。 我的程序在特定用户下运行,该命令必须在SuperUser下运行
这是命令:
Runtime.getRuntime().exec("su - root -c 'pargs -l 1111'");
如果我在其中运行命令,可以正常工作并要求输入密码,然后输入密码,我将得到结果。
问题是我在Java中运行它 这是我的代码
Process proc = Runtime.getRuntime().exec("su - root -c 'pargs -l 1111'");
PrintWriter out = new PrintWriter(new OutputStreamWriter(proc.getOutputStream()));
out.println(password);
out.flush();
int exitCode= proc.waitFor();
System.out.println(exitCode);//exitCode = 1
BufferedReader pArgs= new BufferedReader( new InputStreamReader(proc.getInputStream()));
if((line=pArgs.readLine()) != null)
{
//do something
}
else
{
//something not working = ERROR
}
我认为该行等于null,因为我不确定密码集中的某些内容不正确
我做错了什么?
答案 0 :(得分:4)
我可能会针对此问题提出完全不同的建议。不必尝试运行动态要求输入密码的shell命令,而是使该命令不需要密码。
如果仅由于需要root用户而要求输入密码,则可以在sudoers文件中的root用户下面添加一行,以表明程序用户可以像执行root用户一样执行该特定命令:{{3} }。
这也将更加安全,因为您无需密码在代码中浮动。
答案 1 :(得分:2)
如何通过java中的runtime.exec()传递用户和密码
如果要使用su
,则不能在Solaris下使用。
Solaris su
使用the getpass()
function从用户那里获取必要的密码。
来自the Solaris getpass()
man page:
说明
getpass()
函数打开进程的控制终端,将以空终止的字符串prompt
写到该设备,禁用回显,读取直到下一个换行符或EOF的字符串,恢复终端状态并关闭终端。...
错误
在以下情况下,
getpass()
和getpassphrase()
函数可能会失败:...
ENXIO
该过程没有控制终端。
su
将从控制终端获取密码,否则将失败。
这是一个故意的设计决策,几乎不可能执行不安全的操作,例如自动密码输入。
答案 2 :(得分:0)
非常感谢您提供所有答案。但是我的解决方案有些不同。 决定使用可以在两个过程中读写的外部文件。 整个目标是要再次握手,以防根源运行的进程崩溃(看门狗)。
所以现在不需要使用命令
Runtime.getRuntime().exec("su - root -c 'pargs -l 1111'");
根进程开始运行时,它将时间戳记记录到文件中。 并且如果用户进程(每X次读取文件)发现签名已更改,则他将再次进行握手。