首页 > 解决方案 > 在 Java 中执行 bash-command 不会返回

问题描述

我正在尝试在一些 java 代码中执行一些 bash 命令。目标是获取 rx 和 tx 数据。我有一个执行命令的功能。我已经用其他命令测试了这个功能,它工作正常。

但在此示例中,变量interfaceName始终为空:

public static void main(String args[]) {
    String interfaceCommand = "route | grep default | tr -s ' ' | cut -d ' ' -f 8";
    String interfaceName = executeCommand(interfaceCommand);

    String getRXCommand = "cat /sys/class/net/" + interfaceName + "/statistics/rx_bytes";
    String rxData = executeCommand(getRXCommand);

    String getTXCommand = "cat /sys/class/net/" + interfaceName + "/statistics/tx_bytes";
    String txData = executeCommand(getTXCommand);

    System.out.println(interfaceName);
    System.out.println(getTXCommand);
    System.out.println(getRXCommand);
}

private static String executeCommand(String command) {
    StringBuffer output = new StringBuffer();
    Process p;

    try {
        p = Runtime.getRuntime().exec(command);
        p.waitFor();
        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line = "";           
        while ((line = reader.readLine())!= null) {
            output.append(line + "\n");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

    return output.toString();
}

interfaceName如果我手动将变量设置enp0s31f6为命令以获取 rx 和 tx 数据工作正常(仅在我的测试 PC 上)。但我喜欢在多台电脑上使用该程序,而且界面名称并不总是相同的。所以我需要先获取接口名称。

如果命令使用 | 似乎是个问题 因为我尝试了其他一些命令变体。

这不是命令的正确返回值。正如我所说,没有|的其他命令工作正常......

我不太确定我的错误在哪里,也不是如何开始寻找合适的解决方案。我必须以某种方式逃避|吗?或者是否有另一种解决方案来获取接口名称?

标签: javabashcommandexecute

解决方案


该死的!我真他妈的傻。不必修剪 bash 命令中的输出。我可以得到整个输出并在java中修剪它。或者我尝试使用 NetworkInterface.getNetworkInterfaces() 或其他东西直接在 java 中获取接口名称......

但是今天看来我的程序已经足够了,我的大脑需要休息一下 O_o


推荐阅读