【问题标题】:How to execute sudo commands in Java and get error output? [duplicate]如何在 Java 中执行 sudo 命令并获得错误输出? [复制]
【发布时间】:2019-05-08 18:22:31
【问题描述】:

所以我一直在尝试通过 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 执行时似乎不起作用。

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

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

提前致谢

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

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

【问题讨论】:

标签: java command sudo


【解决方案1】:

有没有办法读取错误输出

是的,请致电p.getErrorStream()

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

【讨论】:

    猜你喜欢
    • 2019-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多