我正在尝试在java程序中打印我的mac [编辑:Apple计算机]序列号。我熟悉Unix命令
ioreg -l | awk '/IOPlatformSerialNumber/ { print $4;}'
在终端完成此任务 当我尝试
String command = "ioreg -l | awk '/IOPlatformSerialNumber/ { print $4; }'"
Runtime terminal = Runtime.getRuntime();
String input = new BufferedReader(
new InputStreamReader(
terminal.exec(commands).getInputStream())).readLine();
System.out.println(new BufferedReader(
new InputStreamReader(
terminal.exec(command, args).getInputStream())).readLine());
我的序列号未打印。相反它打印:
<+-o Root class IORegistryEntry, id 0x100000100, retain 10>
我认为问题是terminal.exec()
并不意味着要占用整个命令字符串。 java中是否存在类似于python shell = True
中的参数Popen(command, stdout=PIPE, shell=True)
的内容,它允许我传递整个命令字符串?
答案 0 :(得分:8)
我看到两种可能性:
使用Scanner解析ioreg -l
的输出。
将命令包装在shell脚本中并exec()
:
#!/bin/sh ioreg -l | awk '/IOPlatformSerialNumber/ { print $4;}'
附录:作为使用ProcessBuilder
并在Paul Cager中加入有用建议的示例,以下是第三种选择:
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class PBTest {
public static void main(String[] args) {
ProcessBuilder pb = new ProcessBuilder("bash", "-c",
"ioreg -l | awk '/IOPlatformSerialNumber/ { print $4;}'");
pb.redirectErrorStream(true);
try {
Process p = pb.start();
String s;
// read from the process's combined stdout & stderr
BufferedReader stdout = new BufferedReader(
new InputStreamReader(p.getInputStream()));
while ((s = stdout.readLine()) != null) {
System.out.println(s);
}
System.out.println("Exit value: " + p.waitFor());
p.getInputStream().close();
p.getOutputStream().close();
p.getErrorStream().close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
答案 1 :(得分:3)
Runtime.exec(..)不支持管道,因为它们是shell的一个功能。相反,你必须自己模拟管道,例如
String ioreg = toString(Runtime.exec("ioreg -l ").getInputStream());
Process awk = Runtime.exec("awk '/IOPlatformSerialNumber/ { print $4;}'");
write(awk.getOutputStream(), ioreg);
String input = new BufferedReader(new InputStreamReader(awk.getInputStream())).readLine();
或者,您当然可以将shell作为进程运行,例如。 Runtime.exec(“bash”),通过读写IO流与之交互。与流程交互有点棘手但有一些问题并让它执行你的命令(见评论)
答案 2 :(得分:1)
要通过Java获取MAC地址,您可以使用java.net.NetworkInterface
:
NetworkInterface.getByName("xxx").getHardwareAddress()
如果您不知道网络接口的名称(我认为它是Linux上的'eth0'),您甚至可以使用NetworkInterface.getNetworkInterfaces()
遍历所有网络接口。