使用 Unix 命令在 java 中打印 Mac 的序列号
我正在尝试在 java 程序中打印我的 mac [编辑:Apple 计算机] 序列号。我熟悉
ioreg -l | awk '/IOPlatformSerialNumber/ { print $4;}'
在终端中完成此任务的 Unix 命令。
当我尝试时,
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的Popen(command, stdout=PIPE, shell=True) 中的参数shell = True
的东西,它允许我传递整个命令字符串?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我看到两种可能性:
使用 ioreg -l 的输出/util/Scanner.html" rel="nofollow noreferrer">扫描仪。
将命令包装在 shell 脚本中并
exec()
它:附录:As使用
ProcessBuilder
的示例,并纳入有用的建议Paul Cager,这是第三种选择:I see two possibilities:
Parse the output of
ioreg -l
using, say, Scanner.Wrap the command in a shell script and
exec()
it:Addendum: As an example of using
ProcessBuilder
, and incorporating a helpful suggestion by Paul Cager, here's a third alternative:Runtime.exec(..) 不支持管道,因为它们是 shell 的一项功能。相反,您必须自己模拟管道,例如,
或者,您当然可以将 shell 作为进程运行,
例如 Runtime.exec("bash"),并通过读取和写入其 IO 流来与其交互。不过,与进程交互有点棘手,并且有一些陷阱并让它执行您的命令(请参阅评论)Pipes aren't supported by Runtime.exec(..) since they are a feature of shells. Instead, you'd have to emulate the pipe yourself, e.g.
Alternatively, you could of course run a shell as a process,
e.g. Runtime.exec("bash"), and interact with it by reading and writing its IO streams. Interacting with processes is a bit tricky though and has some gotchasand let it execute your command (see comments)要通过 Java 获取 MAC 地址,您可以使用
java.net.NetworkInterface
:如果您不知道网络接口的名称(我假设它在 Linux 上是“eth0”),您可以甚至使用 NetworkInterface.getNetworkInterfaces() 迭代所有网络接口。
To get the MAC addres via Java you can use
java.net.NetworkInterface
:If you don't know the name (I assume it to be 'eth0' on linux) of your network interface, you can even iterate throug all of your network interfaces using
NetworkInterface.getNetworkInterfaces()
.