java - 在 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 上)。但我喜欢在多台电脑上使用该程序,而且界面名称并不总是相同的。所以我需要先获取接口名称。
如果命令使用 | 似乎是个问题 因为我尝试了其他一些命令变体。
- 随着
ip -o link show | grep ' UP ' | awk '{print $2}'
变量为空。 随着
ls /sys/class/net/ | grep enp
变量是/sys/class/net/: enp0s31f6 lo vmnet1 vmnet8
这不是命令的正确返回值。正如我所说,没有|的其他命令工作正常......
我不太确定我的错误在哪里,也不是如何开始寻找合适的解决方案。我必须以某种方式逃避|吗?或者是否有另一种解决方案来获取接口名称?
解决方案
该死的!我真他妈的傻。不必修剪 bash 命令中的输出。我可以得到整个输出并在java中修剪它。或者我尝试使用 NetworkInterface.getNetworkInterfaces() 或其他东西直接在 java 中获取接口名称......
但是今天看来我的程序已经足够了,我的大脑需要休息一下 O_o
推荐阅读
- java - 如何使纹理跟随边界框?
- javascript - 无法将mongodb连接到nodejs
- javascript - 带有 javascript 的动态引导程序 4 轮播
- java - Spring Cloud Data Flow:数据流服务器的自定义 DDL
- javascript - 如何在 Next.js 中获取特定的动态 DOM 元素
- c# - 如何以编程方式添加面板并进行编辑?
- java - 写作清单
在 csv java 中使用 CsvPrinter - azure - 无论路径如何,Azure 管道触发器都包括
- php - 如何使用 phpunit 测试确保数据通过查看在 laravel 中具有特定键
- android - 将循环结果添加到变量