Получение списка устройств в сети
Для получения списка устройств, работающих в моей домашней сети (получивших IP от моего DHCP-сервера на своём сетевом интерфейсе), я использую самописный скрипт (смесь PHP и BASH’а). Он отрабатывает около 10 секунд, за это время сканируется сеть для выявления ответивших MAC’ов.
Концепцию можно улучшить, например, переписать его полностью на BASH’е и по cron’у вызывать, допустим, раз в пять минут, пусть он пишет MAC’и наличных сетевых устройств в файл/базу, а WEB-скрипт просто читает оттуда актуальные данные при открытии страницы.
Показать
<?php // задаю необходимые переменные $home_iface='eth0'; // интерфейс, посредством которого система включена в домашнюю сеть $lan='192.168.120.0/24'; // определитель домашней сети (или её гостевого сегмента) $temp_file='/tmp/dev.tmp'; // путь к временному файлу // функция анализа и вывода MAC'а на странице function DrawDevice() { ... } // получаю MAC интерфейса $home_iface $home_mac=exec("sudo ifconfig {$home_iface} | grep 'HWaddr' | awk '{print $5}'"); // отображаю его на странице DrawDevice(trim($home_mac)); // удаляю временный файл, если он есть if(file_exists($temp_file))exec("rm -f {$temp_file}"); // сканирую сетевой диапазон $lan exec("fping {$lan} -age -r 1 >/dev/null 2>/dev/null"); // вычленяю устройства с ответившими MAC'амм // и записываю во временный файл, // можно писать в базу данных для получения динамики exec("ip n | grep 'lladdr' | awk '{print $5}' > {$temp_file}",$h); // получаю список ответивших MAC'ов из временного файла $h=file_get_contents($temp_file); // и удаляю его if(file_exists($temp_file))exec("rm -f {$temp_file}"); $mac=array(); // убираю из списка символы новой строки $mac=explode("\n",$h); // в цикле вывожу MAC'и foreach($mac as$host){DrawDevice($host);} ?>
- Требования:
- 1. в системе должен быть установлен пакет fping (или любой другой с аналогичной функциональностью, например nmap);
- 2. пользователь, от которого запущен WEB-сервер, обычно www-data, можно проверить командой
должен иметь возможность выполнения команды ifconfig от имени суперпользователя (sudo ifconfig) или запускать эту утилиту непостредственно по пути её расположения, обычно /sbin/ifconfig, можно проверить командойps aux | egrep '([a|A]pache|[h|H]ttpd)' | awk '{ print $1}' | uniq | tail -1
whereis ifconfig
Статья написана для Блога «Умного дома».