这个问题在这里已经有答案了:
如何在java中用sudo权限执行bash命令(6个答案)
两年前关门了。
所以我一直在尝试通过java在我的raspberry pi上执行sudo命令:
try {
Process p;
p = Runtime.getRuntime().exec(`command`);
BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
String output = "";
while ((output = reader.readLine()) != null) {
System.out.println(output);
}
reader.close();
p.waitFor();
} catch (IOException | InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} finally {
System.out.println("Process finished");
}
这适用于以下命令 sudo ping google.com
或者 sudo -V
. 我得到了正确的输出。
但我的树莓圆周率,我实际上想通过一个433mhz的发送器发送信号。而需要的命令 sudo ~pi/raspberry-remote/send 11111 3 1
当“手动”执行时,工作完全正常,当通过java执行时,完全相同的代码似乎不工作。
手动执行时,我得到两行输出。如果命令有问题,我会得到一个错误输出。但是当通过java执行时,我没有得到任何输出。甚至连一条错误的信息都没有。甚至像这样的命令 sudo hey123xy
,这显然是不存在的,不要给我任何java输出,尽管控制台说,这个命令不存在。
有没有办法读取控制台的错误输出(可能有助于调试)
如何在java中运行sudo命令?
提前谢谢
编辑:我正在寻找一种“安全”的方法。类似的问题也有答案,答案的作者表示,他/她不建议在答案中使用代码。
编辑2:经过几次混乱@迈赫迪是对的。他/她给出的答案帮助我解决了问题@安德烈亚斯发布了一个非常有用的答案,所以我会把这个标记为正确的答案。。。
1条答案
按热度按时间hs1rzwqc1#
有没有办法读取错误输出
是的,打电话
p.getErrorStream()
.更好的是,使用
ProcessBuilder
打电话给我redirectErrorStream(true)
,因此从getInputStream()
数据。