我正在尝试使用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,因为密码集中的某些内容不正确,我不确定
我做错了什么?
我可能会提出一个完全不同的方法来解决这个问题。而不是尝试运行动态请求密码的shell命令,使命令不需要密码。
如果它只是因为需要root而要求输入密码,你可以在root下的sudoers文件中添加一行来表示你的程序用户可以执行那个特定的命令,就像它们是root:https://www.linux.com/blog/configuring-linux-sudoers-file一样。
这也会更加安全,因为您不会在代码中使用密码。
如何通过java中的runtime.exec()传递用户和pwd
如果你想使用su
,你不能在Solaris下。
Solaris su
使用the getpass()
function从用户那里获取必要的密码。
来自the Solaris getpass()
man page:
描述
getpass()
函数打开进程的控制终端,向该设备写入以null结尾的字符串prompt
,禁用回显,读取一串字符直到下一个换行符或EOF,恢复终端状态并关闭终端。...
错误
如果出现以下情况,
getpass()
和getpassphrase()
函数可能会失败:...
ENXIO
该过程没有控制终端。
su
将从控制终端获取密码,否则将失败。
这是一个刻意的设计决定,几乎不可能执行不安全的操作,如自动密码输入。
非常感谢您的所有答案。但我的解决方案有点不同。决定使用可以从两个进程写入和读取的外部文件。整个目标是再次进行握手,以防根管运行的进程崩溃(看门狗)。
所以现在没有必要使用该命令
Runtime.getRuntime().exec("su - root -c 'pargs -l 1111'");
当根进程开始运行时,它会将时间签名记录到文件中。如果用户(每隔X次读取文件)的进程发现签名已更改,他将再次进行握手。