使用Unix命令在java中打印我的Mac序列号

时间:2011-04-21 06:31:26

标签: java macos unix io

我正在尝试在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)的内容,它允许我传递整个命令字符串?

3 个答案:

答案 0 :(得分:8)

我看到两种可能性:

  1. 使用Scanner解析ioreg -l的输出。

  2. 将命令包装在shell脚本中并exec()

  3. #!/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()遍历所有网络接口。