2010-04-29 17 views
8

Czy ktoś wie, jak wykryć zmianę adresu IP w systemie Linux? Powiedzmy, że działa dhcpcd i przypisuje nowy adres IP, czy istnieje sposób, aby uzyskać powiadomienie po zmianie? Nie mogę używać D-Bus, ponieważ jest to wbudowana wersja systemu ucLinux, która jej nie posiada.Wykrywanie zmiany adresu IP w systemie Linux

inotify na czymś w/proc/net /?

+0

Jak szybko chciałbyś wiedzieć? Czy to wystarczająco długo, aby jakiś głosowanie było do przyjęcia? (Nie to polecam odpytywanie jeśli właściwe zgłoszenie jest dostępny) –

+0

http://stackoverflow.com/questions/8542253/how-to-get-notified-for-ip-address-changes-automatically – LtWorf

Odpowiedz

1

Ponieważ aktywność DHCP jest wysyłana do syslogd, można utworzyć nazwaną potok, skierować do niej ruch syslog i obejrzeć strumień aktualizacji adresów IP. Zobacz "man syslogd" i "man syslog.conf".

Edycja: Innym podejściem byłoby użycie inotify do monitorowania pliku dzierżawy DHCP dla interfejsu. Pod Ubuntu 9.10, który znajduje się w katalogu/var/lib/dhcp3.

+0

Rozwiązanie myślę pójdzie za to inotify monitor/proc/net/route, a następnie użyj SOCOCIFIFDR ioctl do zapytania adresu za każdym razem, gdy zmienia się tabela routingu. –

+1

Prawdopodobnie nie można monitorować plików/proc przy użyciu inotify./proc nie jest "faktycznie" systemem plików, ale raczej interfejsem jądra. – Snowhare

12

Komenda

ip monitor 

pokaże tego typu rzeczy dzieje. Wykorzystuje on API Netlink, który jest dość trudny i nie jest dobrze udokumentowany (przynajmniej dla ludzi, aby zrozumieć). Jednakże jest on w stanie otrzymywać powiadomienia przez jądro o różnych zdarzeniach, takich jak zmiany przydzielonych adresów IP, tablic routingu i stanu łącza (np. Ktoś odłączył sieć)

+1

To wygląda dobrze - bardzo dobrze; dziękuję ... ale niedostępne w wersji BusyBox w ip w systemie ucLinux! –

+0

Dzięki, bardzo przydatne – pylover

1

Co myślałem o uruchomieniu tego skryptu z crona co 10 lub tak minut, w zależności od linku. Jeśli napisałem to poprawnie, to tylko nsupdates, gdy jest zmiana IP, więc żadne nadmierne obciążenie nie jest creater na głównym serwerze strefy.

#!/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 

Nie testowane!

0

Jeśli masz router z uruchomionym DD-WRT i masz stronę statusu używaną podczas przechodzenia do routera, możesz, za pomocą skryptu ... wget stronę statusu, cat dla adresu ip i zapisać go do plik do porównania, wyślij wiadomość e-mail, gdy zmieni się najnowszy adres IP wget z pliku porównywalnego.

Używam programu dd-wrt na routerze linksys wrt54g i używam tego skryptu: Wgetuje stronę statusu routera z 192.168.3.1, używa kota na stronie (index.html) i greps dla adresu wan ip , a następnie zapisuje go do pliku (gotip.txt).

Dokonano porównania przechwyconego pliku ip (gotip.txt) z bieżącym działającym plikiem ip (workingip.txt). Jeśli adresy IP są różne, otrzymuję wiadomość e-mail wysłaną pocztą elektroniczną nowego adresu IP, a nowy działający adres IP jest zapisywany w pliku workingip.txt.

Cron uruchomić ten co 5 minut lub tak i mam wyjście cron wyciszony do/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="[email protected]" 
    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 
13

To stara sprawa, ale będę odpowiedź dla tych, którzy przybędą przez Google (takich jak ja). Po kilku chwilach zmagań dowiedziałem się, że niekoniecznie musisz sondować lub zhakować rozwiązanie C dla tego. W moim przypadku chciałem zaktualizować domenę mojego serwera macierzystego (dynamiczną domenę dns) po zmianie adresu IP.

Jeśli używasz dhcpcd, masz szczęście.dhcpcd uruchomi skrypty przechwytujące, gdy coś się stanie. Zobacz man dhcpcd-run-hooks(online here). Zasadniczo będziesz chciał zmodyfikować lub utworzyć własny dhcpcd.enter-hook lub dhcpcd.exit-hook w zależności od tego, co chcesz zrobić z danymi dostarczonymi przez wydarzenie.

1

To jest starsza nitka, ale na wypadek, gdyby ktoś znalazł ją tak, jak ja, napisałem coś, co wykrywa zmianę sieci/powiadomienia w Linuksie (głównie w celu pomocy użytkownikom VPN), a dzięki niektórym nachalnym przyjaciołom stawiam to do użytku dla innych. Teraz jest to projekt dla zwierząt domowych i aktywnie go utrzymuję, więc życzenia i opinie są mile widziane.

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