如何通过 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次读取文件)发现签名改变了,他将再次进行握手。
我正在尝试 运行 使用 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 stringprompt
, 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()
andgetpassphrase()
functions may fail if:...
ENXIO
The process does not have a controlling terminal.
su
要么从控制终端获取密码,要么失败。
这是一个深思熟虑的设计决定,几乎不可能执行不安全的操作,例如自动输入密码。
非常感谢您的所有回答。但我的解决方案有点不同。 决定使用可以从两个进程写入和读取的外部文件。 整个目标是再次握手,以防根进程 运行 失败(看门狗)。
所以现在不需要使用命令
Runtime.getRuntime().exec("su - root -c 'pargs -l 1111'");
当根进程启动时 运行,它会将拍号记录到文件中。 并且如果用户的进程(每X次读取文件)发现签名改变了,他将再次进行握手。