Выдрать имена сетевых интерфейсов и их IP-адреса (PHP, регулярные выражения)

Модератор: Модераторы разделов

Аватара пользователя
Corsair
Сообщения: 842
Статус: Местный "тролль"
ОС: Fedora

Выдрать имена сетевых интерфейсов и их IP-адреса

Сообщение Corsair »

Есть задачка получить в скрипте имена и ИПы интерфейсов, да при чем не как попало, а чтобы имя адресу соответствовало. Думаю наиболее красиво в массиве будет.

Сделал вот так:

Код: Выделить всё

<?php
    $output = shell_exec('/sbin/ifconfig');
    echo $output."<br><br>";
    if (preg_match_all("/inet\ addr\:([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})/", $output, $matches)){
        for($i = 0; $i < count($matches[1]); $i++)
            echo $matches[1][$i].'<br>';
    }
    if (preg_match_all("/eth[0-9]|lo|ppp[0-9]+/", $output, $matches)){
        for($i = 0; $i < count($matches[0]); $i++)
            echo $matches[0][$i].'<br>';
    }
?>


Ну вот не лежит душа к этому решению, как-то некрасиво получилось. Да и не без проблем: так и не додумался как мне гарантированно получить правильную пару "имя-адрес";
Совсем под вечер голова не работает что-то...

UPD: ха-ха. Надо завязывать на сегодня. Я уже русский с PHP путаю. Вместо точки точку с запятой поставил в конце предложения=))

UPD: да еще один недочет: имена интерфейсов. У меня тут только eth и ppp, а что если у меня еще wlan есть, не говоря о каких-то нестандартных типа ath. Не смог придумать универсального выражения
Жестокий стоячий админ (с) коллега
Спасибо сказали:
Аватара пользователя
Corsair
Сообщения: 842
Статус: Местный "тролль"
ОС: Fedora

Re: Выдрать имена сетевых интерфейсов и их IP-адреса

Сообщение Corsair »

Если кому пригодится - вот как-то так.

Код: Выделить всё

function getIfInfo($dev){
        if(is_array($dev))
            foreach($dev as $val){
                $output = shell_exec("/sbin/ifconfig $val");
                if(preg_match("/HWaddr ([abcdefABCDEF0-9]{2}\:[abcdefABCDEF0-9]{2}\:[abcdefABCDEF0-9]{2}\:[abcdefABCDEF0-9]{2}\:[abcdefABCDEF0-9]{2}\:[abcdefABCDEF0-9]{2})/", $output,$matches)){
                    $hwaddr = $matches[1];
                }
                if(preg_match("/inet addr:([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})/",$output,$matches)){
                    $addr = $matches[1];
                }
                if(preg_match("/Mask:([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})/",$output,$matches)){
                    $mask = $matches[1];
                }
                $devices[] = array ('iface' => $val,
                                    'hwaddr' => $hwaddr,
                                    'addr' => $addr,
                                    'mask' => $mask);
            }
}
Жестокий стоячий админ (с) коллега
Спасибо сказали: