有谁知道在Linux中检测IP地址变化的方法。假设我正在运行 dhcpcd,它分配了一个新的 IP 地址,有没有办法在它更改时收到通知?我不能使用 D-Bus,因为这是一个没有它的嵌入式 ucLinux 构建。
通知 /proc/net/ 中的某些内容?
这是一个老问题,但我会为那些将通过谷歌到达的人(比如我自己)回答。经过一段时间的努力,我发现您不一定需要为此轮询或破解 C 解决方案。对于我的情况,我想在 IP 更改时更新我的家庭服务器的(动态 dns)域。
如果你在跑步dhcpcd
,你很幸运。dhcpcd
发生任何事情时将运行挂钩脚本。见man dhcpcd-run-hooks
(在这里在线)。基本上你会想要修改或创建你自己的dhcpcd.enter-hook
,或者dhcpcd.exit-hook
取决于你想对事件提供的数据做什么。
命令
ip monitor
会告诉你这种事情正在发生。它使用了一些相当棘手且没有很好记录的 netlink API(至少对于人类来说是可以理解的)。但是,它能够得到内核各种事件的通知,例如分配的 IP、路由表和链路状态的变化(例如有人拔掉网络)
由于 DHCP 活动被发送到 syslogd,您可以创建一个命名管道,将 syslog 流量定向到它并观察 IP 地址更新的流。请参见“man syslogd”和“man syslog.conf”。
编辑:另一种方法是使用 inotify 来监控接口的 DHCP 租约文件。在 /var/lib/dhcp3 目录中的 Ubuntu 9.10 下。
这是一个较旧的线程,但如果有人像我一样发现它,我不久前写了一些在 Linux 中进行网络更改检测/通知的东西(主要针对帮助 VPN 用户),并且感谢一些咄咄逼人的朋友,我为其他人提供了它使用。它现在是一个宠物项目,我正在积极维护它,所以欢迎提出功能请求和反馈。
我想到的是每隔 10 分钟左右从 cron 运行这个脚本,具体取决于您的链接。如果我写对了,它只会在 IP 更改时 nsupdates,因此不会在区域的主服务器上创建过度负载。
#!/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
我认为您可以在现代 Linux 发行版上使用 dbus 来执行此操作。如果您的发行版使用 NetworkManager,请参阅此文档以获取有关其 dbus 接口的信息:
http://people.redhat.com/dcbw/NetworkManager/NetworkManager%20DBUS%20API.txt
如果您有一个运行 DD-WRT 的路由器,并且在访问路由器时使用了状态页面,您可以使用脚本... wget 状态页面,cat 获取 IP 地址并将其写入文件以进行比较,当最新的 wget ip 地址与比较文件中的内容不同时,发送一封电子邮件。
我在 linksys wrt54g 路由器上运行 dd-wrt 并使用此脚本:它从 192.168.3.1 获取路由器状态页面,在页面 (index.html) 上使用 cat 并使用 greps 获取 wan ip 地址,然后将其写入一个文件(gotip.txt)。
在捕获的 ip (gotip.txt) 和当前工作 ip (workingip.txt) 之间进行比较。如果ip地址不同,我会收到一封新ip的send mail发送的邮件,新的工作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