Почему это не возвращает IP-адрес? - PullRequest
2 голосов
/ 22 февраля 2011

Я не могу заставить это вернуть ничего, кроме null для ip.Я, должно быть, что-то упустил в том, как я форматирую операции внутри массива String, пожалуйста, помогите!Кроме того, есть ли лучший SDK для работы с командной строкой в ​​Java? Обновление Для дальнейшего использования, это инстанс EC2, и выполнение InetAddress.getLocalHost () возвращает значение NULL, поэтому я вернулся к командной строке (AWS SDK является своего рода болью просто для детализации)для локального IP-адреса).

// Команда для запуска: /sbin/ifconfig | awk 'NR==2{print$2}' | sed 's/addr://g'

String[] command = new String[] {"/sbin/ifconfig", "awk 'NR==2{print$2}'", "sed 's/addr://g'" };
String ip = runCommand(command);

public static String runCommand(String[] command) {
        String ls_str;
        Process ls_proc = null;
        try {
            ls_proc = Runtime.getRuntime().exec(command);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        DataInputStream ls_in = new DataInputStream(ls_proc.getInputStream());

        try {
            while ((ls_str = ls_in.readLine()) != null) {
                    return ls_str;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

Ответы [ 5 ]

5 голосов
/ 22 февраля 2011
  1. Почему вы пытаетесь использовать Runtime.exec(), когда существует совершенно простой способ перечисления сетевых интерфейсов в Java ?
  2. Вы пытаетесь выполнить несколько команд, передавая одну команду на другую. Эта работа обычно выполняется оболочкой. При непосредственном его выполнении вы не получите эту функцию. Вы можете обойти этот факт, вызвав оболочку и передав ей весь канал в качестве аргумента для выполнения.
  3. Читать Когда Runtime.exec() не будет . Он суммирует все основные подводные камни, с которыми вы можете столкнуться при использовании Runtime.exec() (включая тот, который упомянут в # 2), и рассказывает, как их избежать / устранить.
1 голос
/ 22 февраля 2011

Форма Runtime.exec(), которая принимает String[], не выполняет несколько команд в конвейере.Скорее он выполняет одну команду с дополнительными аргументами.Я думаю, что самый простой способ сделать то, что вы хотите, это exec оболочка для конвейера:

Runtime.getRuntime().exec(new String[] { 
    "bash", "-c", "/sbin/ifconfig | awk 'NR==2{print$2}' | sed 's/addr://g'"
});
1 голос
/ 22 февраля 2011

Если вы передаете массив в exec (), он действует так, как будто все элементы после первого являются аргументами первого. «awk» не является допустимым аргументом для ifconfig.

1 голос
/ 22 февраля 2011
    StringBuilder result = new StringBuilder()

    try {
        while ((ls_str = ls_in.readLine()) != null) {
            result.append(ls_str);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }

    return result.toString();
0 голосов
/ 22 февраля 2011

Вы можете использовать java.net.NetworkInterface.Например:

public static List<String> getIPAdresses() {
    List<String> ips = new ArrayList<String>();
    try {
        Enumeration<NetworkInterface> e = NetworkInterface.getNetworkInterfaces();

        while (e.hasMoreElements()) {
            NetworkInterface ni = e.nextElement();

            Enumeration<InetAddress> e2 = ni.getInetAddresses();

            while (e2.hasMoreElements()) {
                InetAddress ip = e2.nextElement();
                if (!ip.isLoopbackAddress())
                    ips.add(ip.getHostAddress());
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return ips;
}

Йоахим Зауэр уже разместил ссылку на документацию

...