Печать серийного номера моего Mac в Java с помощью команд Unix - PullRequest
5 голосов
/ 21 апреля 2011

Я пытаюсь напечатать серийный номер моего mac [edit: Apple computer] в java-программе. Я знаком с командой 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 что-то похожее на аргумент shell = True в Python Popen(command, stdout=PIPE, shell=True), который позволит мне передать всю командную строку?

Ответы [ 3 ]

8 голосов
/ 21 апреля 2011

Я вижу две возможности:

  1. Разобрать вывод ioreg -l, скажем, Сканер .

  2. Обернуть команду в сценарий оболочки и exec() it:

#!/bin/sh
ioreg -l | awk '/IOPlatformSerialNumber/ { print $4;}'

Приложение: В качестве примера использования ProcessBuilder и включения полезного предложения Пола Кагера , вот третий вариант:

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();
        }
    }
}
3 голосов
/ 21 апреля 2011

Трубы не поддерживаются Runtime.exec (..), так как они являются функцией оболочек.Вместо этого вам придется самостоятельно эмулировать канал, например,

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();

В качестве альтернативы вы, конечно, можете запустить оболочку как процесс, например, Runtime.exec ("bash"), и взаимодействоватьс помощью чтения и записи потоков ввода / вывода.Взаимодействие с процессами немного сложнее, но имеет некоторые ошибки и позволяет ему выполнить вашу команду (см. Комментарии)

1 голос
/ 21 апреля 2011

Чтобы получить MAC-адреса через Java, вы можете использовать java.net.NetworkInterface:

NetworkInterface.getByName("xxx").getHardwareAddress()

Если вы не знаете имя (я предполагаю, что это 'eth0' в linux) вашего сетевого интерфейсавы даже можете выполнять итерации по всем вашим сетевым интерфейсам, используя NetworkInterface.getNetworkInterfaces().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...