Обнаружение изменения IP-адреса в Linux - PullRequest
9 голосов
/ 29 апреля 2010

Кто-нибудь знает способ обнаружить изменение IP-адреса в Linux. Скажем, у меня запущен dhcpcd, и он назначает новый IP-адрес. Есть ли способ получить уведомление при его изменении? Я не могу использовать D-Bus, потому что это встроенная сборка ucLinux, у которой ее нет.

inotify о чем-либо в / proc / net /?

Ответы [ 7 ]

13 голосов
/ 13 декабря 2013

Это старый вопрос, но я отвечу для тех, кто приедет через Google (например, я). Поработав некоторое время, я обнаружил, что вам не обязательно опрашивать или взламывать C-решение для этого. В моем случае я хотел обновить домен моего домашнего сервера (динамический DNS) при изменении IP-адреса.

Если вы бежите dhcpcd, вам повезло. dhcpcd будет запускать скрипты ловушек, когда что-нибудь случится. См. man dhcpcd-run-hooks (онлайн здесь) . В основном вы захотите изменить или создать свои собственные dhcpcd.enter-hook или dhcpcd.exit-hook в зависимости от того, что вы хотите сделать с данными, предоставленными событием.

13 голосов
/ 30 апреля 2010

Команда

ip monitor

покажет вам, что такое происходит. Он использует API-интерфейс netlink, который довольно сложен и плохо документирован (по крайней мере, для понимания людьми). Однако ядро ​​может получать уведомления о различных событиях, таких как изменение назначенных IP-адресов, таблиц маршрутизации и состояния канала (например, кто-то отключил сеть)

1 голос
/ 18 декабря 2013

Это более старая тема, но на тот случай, если кто-то найдет ее, как я, я написал что-то, что делает обнаружение / уведомление об изменении сети в Linux некоторое время назад (в основном, для помощи пользователям VPN), и благодаря некоторым напористым друзьям, я добавил этодля других, чтобы использовать.Сейчас это любимый проект, и я активно поддерживаю его, поэтому просьбы о новых функциях и отзывы приветствуются.

http://code.google.com/p/ipcheck/source/browse/ipcheck.sh

1 голос
/ 14 июня 2011

Я думал о том, чтобы запускать этот скрипт из cron каждые 10 минут или около того, в зависимости от вашей ссылки. Если я написал это право, он обновляется только при изменении IP-адреса, поэтому на главном сервере зоны не создается ненужная загрузка.

#!/bin/bash

OLD_IP=`cat ip.txt`

NEW_IP=`/sbin/ifconfig  | awk -F "[: ]+'{ print $4}'` #adapted from something I got from the internets.

if [ $NEW_IP != OLD_IP ]; then
    nsupdate <commands> #it seems like the keys need to be in the same directory from where nsupdate was called
fi

echo $NEW_IP > ip.txt

exit 0 #not sure if this is necessary

Не проверено!

1 голос
/ 30 апреля 2010

Поскольку активность DHCP отправляется в syslogd, вы можете создать именованный канал, направить ему трафик syslog и наблюдать за потоком обновлений IP-адресов. Смотрите man syslogd и man syslog.conf.

Редактировать. Другой подход заключается в использовании inotify для мониторинга файла аренды DHCP для интерфейса. В Ubuntu 9.10, которая находится в каталоге / var / lib / dhcp3.

0 голосов
/ 16 октября 2013

Если у вас есть маршрутизатор с DD-WRT и у вас есть страница состояния, используемая при переходе к маршрутизатору, вы можете с помощью скрипта ... wget страницу состояния, cat для IP-адреса и записать его в файл для сравнения, отправьте электронное письмо, когда последний IP-адрес wget изменился по сравнению с тем, что находится в файле сравнения.

Я запускаю dd-wrt на маршрутизаторе linksys wrt54g и использую этот скрипт: Он получает страницу состояния маршрутизатора из 192.168.3.1, использует cat на странице (index.html) и greps для адреса wan ip, а затем записывает его в файл (gotip.txt).

Проводится сравнение между захваченным ip (gotip.txt) и текущим рабочим ip (workingip.txt). Если IP-адреса отличаются, я получаю электронное письмо, отправленное по почте с новым IP-адресом, и новый рабочий IP-адрес записывается в файл workingip.txt.

Cron запускает это каждые 5 минут или около того, и у меня вывод cron отключен на / dev / null

#!/bin/bash

getip=$(wget http://192.168.3.1/)
cat index.html | grep "wan_ipaddr" > gotip.txt

gotip=$(cat gotip.txt)
compare=$(cat workingip.txt)

if [[ "$compare" != "$gotip" ]]
    then 
    EMAIL="youremail@foo.net"
    EMAILMESSAGE="/home/pi/ipmessage.txt"
    echo "ip address is now $gotip" >> $EMAILMESSAGE
    /usr/sbin/sendmail -t "$EMAIL" < $EMAILMESSAGE
    rm ipmessage.txt
    cp gotip.txt workingip.txt
    rm index.html

else
echo "done"
rm index.html
fi
0 голосов
/ 30 апреля 2010

Я думаю, вы можете использовать dbus для этого в современных дистрибутивах Linux. Если ваш дистрибутив использует NetworkManager, обратитесь к этому документу за информацией об интерфейсе dbus:

http://people.redhat.com/dcbw/NetworkManager/NetworkManager%20DBUS%20API.txt

...