在Linux中检测IP地址的变化

时间:2010-04-29 16:18:19

标签: linux ip dhcp

有没有人知道在Linux中检测IP地址更改的方法。假设我运行了dhcpcd,并且它分配了一个新的IP地址,有什么方法可以在它发生变化时收到通知吗?我不能使用D-Bus,因为这是一个没有它的嵌入式ucLinux构建。

inotify on / proc / net /?

7 个答案:

答案 0 :(得分:13)

这是一个老问题,但我会回答那些将由谷歌到达的人(比如我自己)。经过一段时间的努力,我发现你不一定需要为此调查或破解C解决方案。对于我的情况,我想在IP更改时更新我的​​家庭服务器(动态DNS)域。

如果您正在运行dhcpcd,那么您很幸运。当发生任何事情时,dhcpcd将运行钩子脚本。请参阅man dhcpcd-run-hooks (online here)。基本上,您需要修改或创建自己的dhcpcd.enter-hookdhcpcd.exit-hook,具体取决于您要对事件提供的数据执行的操作。

答案 1 :(得分:12)

命令

ip monitor

会告诉你这种事情正在发生。它使用了一些相当棘手且没有很好记录的netlink API(至少对人类来说是理解的)。但是,它能够通过内核通知各种事件,例如更改分配的IP,路由表和链接状态(例如某人拔掉网络)

答案 2 :(得分:1)

由于DHCP活动被发送到syslogd,您可以创建一个命名管道,将syslog流量引导到它并观察流的IP地址更新。请参阅'man syslogd'和'man syslog.conf'。

编辑:另一种方法是使用inotify监视接口的DHCP租约文件。在Ubuntu 9.10下,位于/ var / lib / dhcp3目录中。

答案 3 :(得分:1)

我想到的是每10分钟从cron运行一次这个脚本,具体取决于你的链接。 如果我写得正确,它只会在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

未经测试!

答案 4 :(得分:1)

这是一个较老的线程但是如果有人发现它像我一样,我写了一些东西,在Linux中做了一段时间的网络变化检测/通知(主要是针对帮助VPN用户),并且感谢一些咄咄逼人的朋友我把它供其他人使用。这是一个宠物项目,我正在积极维护它,所以欢迎功能请求和反馈。

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

答案 5 :(得分:0)

我认为您可以使用dbus在现代Linux发行版上执行此操作。如果您的发行版使用NetworkManager,请参阅此文档以获取有关其dbus接口的信息:

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

答案 6 :(得分:0)

如果您的路由器运行DD-WRT并且在转到路由器时使用状态页面,您可以使用脚本... wget状态页面,cat为ip地址并将其写入文件为了进行比较,当最新的wget ip地址与比较文件中的内容相比发生变化时,会发送电子邮件。

我在linksys wrt54g路由器上运行dd-wrt并使用此脚本: 它从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