如何在java中通过runtime.exec()传递用户和pwd

如何在java中通过runtime.exec()传递用户和pwd,java,sh,solaris,runtime.exec,Java,Sh,Solaris,Runtime.exec,我正在尝试使用Java1.8和OSSolaris 11运行一个简单的命令。 我的程序在特定用户下运行,命令必须在超级用户下运行 命令如下: Runtime.getRuntime().exec(“su-root-c'pargs-l 1111’”) 如果我运行的命令,将其工作正常,并要求密码和我输入密码,我将得到结果 问题是我用java运行它 这是我的密码 Process proc = Runtime.getRuntime().exec("su - root -c 'pargs -l 1111'")

我正在尝试使用Java1.8和OSSolaris 11运行一个简单的命令。 我的程序在特定用户下运行,命令必须在超级用户下运行

命令如下:

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:

这也会更安全,因为您不会让密码在代码周围浮动

如何在java中通过runtime.exec()传递用户和pwd

如果要使用
su
,则不能在Solaris下使用

用于从用户处获取必要的密码

发件人:

说明

getpass()
函数打开进程的控制终端,向该设备写入以null结尾的字符串
提示符
,禁用回显,读取字符串直到下一个换行符或EOF,恢复终端状态并关闭终端

错误

如果出现以下情况,则
getpass()
getpassphrase()
函数可能会失败:

ENXIO

该进程没有控制终端

su
将从控制终端获取密码,否则将失败


这是一个经过深思熟虑的设计决策,它几乎不可能执行不安全的操作,例如自动输入密码。

非常感谢您提供的所有答案。但我的解决方案有点不同。 决定使用可以从两个进程写入和读取的外部文件。 整个目标是再次握手,以防在根目录下运行的进程崩溃(看门狗)

因此,现在不需要使用该命令

Runtime.getRuntime().exec("su - root -c 'pargs -l 1111'");
当根进程开始运行时,它会将时间签名记录到文件中。
如果用户(每X次读取一次文件)的过程发现签名已更改,他将再次进行握手。

那么我该怎么办?我需要从在defrent user下运行的进程中查找在root下运行的进程。我想这是在Solaris 11中默认的。您可能需要将其安装到9或10。Java能够检查进程:
可选的processArgs=ProcessHandle.of(1111.info().arguments()根据进程的所有者,即使没有root权限,也可以执行此操作。