有没有人知道在Linux中检测IP地址更改的方法。假设我运行了dhcpcd,并且它分配了一个新的IP地址,有什么方法可以在它发生变化时收到通知吗?我不能使用D-Bus,因为这是一个没有它的嵌入式ucLinux构建。
inotify on / proc / net /?
答案 0 :(得分:13)
这是一个老问题,但我会回答那些将由谷歌到达的人(比如我自己)。经过一段时间的努力,我发现你不一定需要为此调查或破解C解决方案。对于我的情况,我想在IP更改时更新我的家庭服务器(动态DNS)域。
如果您正在运行dhcpcd
,那么您很幸运。当发生任何事情时,dhcpcd
将运行钩子脚本。请参阅man dhcpcd-run-hooks
(online here)。基本上,您需要修改或创建自己的dhcpcd.enter-hook
或dhcpcd.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用户),并且感谢一些咄咄逼人的朋友我把它供其他人使用。这是一个宠物项目,我正在积极维护它,所以欢迎功能请求和反馈。
答案 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