我正在尝试使用 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 = 1BufferedReader pArgs= new BufferedReader( new InputStreamReader(proc.getInputStream()));if((line=pArgs.readLine()) != null){ //do something}else{ //something not working = ERROR }我认为该行等于 null 因为密码集中的某些内容不正确蝙蝠我不确定我做错了什么?
3 回答
Smart猫小萌
TA贡献1911条经验 获得超7个赞
如何通过java中的runtime.exec()传递用户和密码
如果您想使用su
.
Solarissu
使用该getpass()
函数从用户那里获取必要的密码。
从Solarisgetpass()
手册页:
描述
该
getpass()
函数打开进程的控制终端,将空终止字符串写入该设备prompt
,禁用回显,读取字符串直到下一个换行符或 EOF,恢复终端状态并关闭终端。...
错误
如果出现以下情况,
getpass()
和getpassphrase()
函数可能会失败:...
ENXIO
该进程没有控制终端。
su
要么从控制终端获取密码,要么失败。
这是一个深思熟虑的设计决策,几乎不可能执行不安全的操作,例如自动输入密码。
MYYA
TA贡献1868条经验 获得超4个赞
非常感谢您的所有回答。但我的解决方案有点不同。决定使用可以从两个进程写入和读取的外部文件。整个目标是再次握手,以防在根运行的进程失败(看门狗)。
所以现在不需要使用命令
Runtime.getRuntime().exec("su - root -c 'pargs -l 1111'");
当根进程开始运行时,它会将拍号记录到文件中。如果用户的进程(每X次读取文件)发现签名发生了变化,他将再次握手。
添加回答
举报
0/150
提交
取消