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

问题描述 投票:2回答:3

我正在尝试使用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,因为密码集中的某些内容不正确,我不确定

我做错了什么?

java sh solaris runtime.exec
3个回答
4
投票

我可能会提出一个完全不同的方法来解决这个问题。而不是尝试运行动态请求密码的shell命令,使命令不需要密码。

如果它只是因为需要root而要求输入密码,你可以在root下的sudoers文件中添加一行来表示你的程序用户可以执行那个特定的命令,就像它们是root:https://www.linux.com/blog/configuring-linux-sudoers-file一样。

这也会更加安全,因为您不会在代码中使用密码。


2
投票

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

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

Solaris su使用the getpass() function从用户那里获取必要的密码。

来自the Solaris getpass() man page

描述

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

...

错误

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

...

ENXIO

该过程没有控制终端。

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

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


0
投票

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

所以现在没有必要使用该命令

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

当根进程开始运行时,它会将时间签名记录到文件中。如果用户(每隔X次读取文件)的进程发现签名已更改,他将再次进行握手。

© www.soinside.com 2019 - 2024. All rights reserved.