如何在 Java 中执行 sudo 命令并得到错误输出?
How to execute sudo commands in Java and get error output?
所以我一直在尝试通过 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
等命令。我得到了正确的输出。
但是对于我的 Raspberry Pi,我实际上想通过 433Mhz 发送器发送信号。虽然像 sudo ~pi/raspberry-remote/send 11111 3 1
这样的所需命令在执行 "by hand" 时工作得很好,但 exact same 代码似乎没有通过 Java.
执行时工作
手动执行时,我得到 2 行输出。如果命令有问题,我会得到一个错误输出。但是当通过 Java 执行时,我根本没有得到任何输出。甚至没有错误消息。即使是像 sudo hey123xy
这样显然不存在的命令,也不会在 Java 中给我任何输出,尽管控制台显示该命令不存在。
- 有没有办法读取控制台的错误输出? (可能有助于调试)
- 如何在 Java 中 运行 sudo 命令?
提前致谢
编辑:我正在寻找一种 "secure" 的方法。有类似问题的答案,其中答案的作者指出,he/she 不建议使用答案中的代码。
编辑 2:经过一些困惑...@Mehdi 是对的。 he/she 链接的答案帮助我解决了我的问题。 @Andreas 发布了一个非常有用的答案,所以我将其标记为正确答案...
Is there a way to read the error output
是,致电p.getErrorStream()
。
更好的是,使用 ProcessBuilder
and call redirectErrorStream(true)
,因此错误输出是从 getInputStream()
数据中读取的。
所以我一直在尝试通过 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
等命令。我得到了正确的输出。
但是对于我的 Raspberry Pi,我实际上想通过 433Mhz 发送器发送信号。虽然像 sudo ~pi/raspberry-remote/send 11111 3 1
这样的所需命令在执行 "by hand" 时工作得很好,但 exact same 代码似乎没有通过 Java.
手动执行时,我得到 2 行输出。如果命令有问题,我会得到一个错误输出。但是当通过 Java 执行时,我根本没有得到任何输出。甚至没有错误消息。即使是像 sudo hey123xy
这样显然不存在的命令,也不会在 Java 中给我任何输出,尽管控制台显示该命令不存在。
- 有没有办法读取控制台的错误输出? (可能有助于调试)
- 如何在 Java 中 运行 sudo 命令?
提前致谢
编辑:我正在寻找一种 "secure" 的方法。有类似问题的答案,其中答案的作者指出,he/she 不建议使用答案中的代码。
编辑 2:经过一些困惑...@Mehdi 是对的。 he/she 链接的答案帮助我解决了我的问题。 @Andreas 发布了一个非常有用的答案,所以我将其标记为正确答案...
Is there a way to read the error output
是,致电p.getErrorStream()
。
更好的是,使用 ProcessBuilder
and call redirectErrorStream(true)
,因此错误输出是从 getInputStream()
数据中读取的。