如何在Java中执行sudo命令并获取错误输出?

时间:2018-12-07 00:58:29

标签: java command sudo

所以我一直试图通过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.comsudo -V之类的命令。我得到正确的输出。

但是对于我的Raspberry Pi,我实际上想通过433Mhz发送器发送信号。尽管所需的命令sudo ~pi/raspberry-remote/send 11111 3 1在“手动”执行时完全可以正常工作,但是 精确相同代码在通过Java执行时似乎不起作用。< / p>

手动执行时,我得到2行输出。如果命令有问题,我将显示错误输出。但是当通过Java执行时,我根本没有输出。甚至没有错误消息。即使sudo hey123xy之类的命令显然不存在,也不会给我任何Java输出,尽管控制台说该命令不存在。

  1. 是否可以读取控制台的错误输出? (可能有助于调试)
  2. 如何在Java中运行sudo命令?

预先感谢

编辑:我正在寻找一种“安全”的方式。有类似问题的答案,答案的作者指出,他/她不建议使用答案中的代码。

编辑2:经过一些混乱之后……@Mehdi是正确的。他/她链接的答案帮助我解决了我的问题。 @Andreas发布了一个非常有用的答案,因此我将其标记为正确的答案...

1 个答案:

答案 0 :(得分:1)

  

有没有办法读取错误输出

是的,请致电p.getErrorStream()

更好的方法是使用ProcessBuilder并调用redirectErrorStream(true),以便从getInputStream()数据中读取错误输出。