13

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

通知 /proc/net/ 中的某些内容?

4

7 回答 7

23

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

如果你在跑步dhcpcd,你很幸运。dhcpcd发生任何事情时将运行挂钩脚本。见man dhcpcd-run-hooks (在这里在线)。基本上你会想要修改或创建你自己的dhcpcd.enter-hook,或者dhcpcd.exit-hook取决于你想对事件提供的数据做什么。

于 2013-12-13T19:22:38.680 回答
17

命令

ip monitor

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

于 2010-04-29T22:16:01.647 回答
1

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

编辑:另一种方法是使用 inotify 来监控接口的 DHCP 租约文件。在 /var/lib/dh​​cp3 目录中的 Ubuntu 9.10 下。

于 2010-04-29T21:00:27.913 回答
1

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

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

于 2013-12-18T04:19:48.347 回答
1

我想到的是每隔 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

未测试!

于 2011-06-14T01:36:37.990 回答
0

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

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

于 2010-04-29T21:03:00.500 回答
0

如果您有一个运行 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
于 2013-10-16T17:05:20.627 回答