如何通过 java 中的 runtime.exec() 传递用户和密码

how to pass the user and pwd via the runtime.exec() in java

我正在尝试 运行 使用 java 1.8 和 OS Solaris 11 的简单命令。 我的程序 运行s 在特定用户下,命令必须在 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 
}

我认为该行等于空,因为密码集中的某些内容不正确,我不确定

我做错了什么?

我可能会提出一个完全不同的方法来解决这个问题。与其尝试 运行 动态要求输入密码的 shell 命令,不如让该命令不需要密码。

如果它只是要求输入密码,因为它需要 root,您可以在 root 下的 sudoers 文件中添加一行,说明您的程序用户可以像 root 一样执行该特定命令:https://www.linux.com/blog/configuring-linux-sudoers-file.

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

how to pass the user and pwd via the runtime.exec() in java

如果你想使用su,你不能在Solaris下。

Solaris su uses the getpass() function 从用户那里得到必要的密码。

来自 the Solaris getpass() man page:

Description

The getpass() function opens the process's controlling terminal, writes to that device the null-terminated string prompt, disables echoing, reads a string of characters up to the next newline character or EOF, restores the terminal state and closes the terminal.

...

Errors

The getpass() and getpassphrase() functions may fail if:

...

ENXIO

The process does not have a controlling terminal.

su 要么从控制终端获取密码,要么失败。

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

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

所以现在不需要使用命令

Runtime.getRuntime().exec("su - root -c 'pargs -l 1111'");

当根进程启动时 运行,它会将拍号记录到文件中。 并且如果用户的进程(每X次读取文件)发现签名改变了,他将再次进行握手。