LinuxでIPアドレスの変更を検出する方法を知っている人はいますか? dhcpcd を実行していて、新しい IP アドレスが割り当てられているとします。変更されたときに通知を受け取る方法はありますか? これは組み込みの ucLinux ビルドであり、D-Bus を使用していないため、D-Bus を使用できません。
/proc/net/ 内の何かを inotify しますか?
これは古い質問ですが、Googleで到着する人(私など)のために答えます。しばらく苦労した後、これには必ずしも C ソリューションをポーリングまたはハッキングする必要がないことがわかりました。私の場合、IP が変更されたときにホーム サーバーの (動的 dns) ドメインを更新したいと考えていました。
あなたが走っているならdhcpcd
、あなたは幸運です。dhcpcd
何かが起こったときにフックスクリプトを実行します。man dhcpcd-run-hooks
(オンラインはこちら)を参照してください。基本的には、イベントによって提供されるデータで何をしたいdhcpcd.enter-hook
かによって、独自に変更または作成する必要があります。dhcpcd.exit-hook
コマンド
ip monitor
このようなことが起こっていることを示します。それはかなりトリッキーで、十分に文書化されていないネットリンク API を使用します (少なくとも人間が理解するには)。ただし、割り当てられた IP の変更、ルーティング テーブル、リンク ステータス (誰かがネットワークからプラグを抜いたなど) など、さまざまなイベントのカーネルからの通知を受け取ることができます。
私が考えたのは、リンクに応じて、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
DHCP アクティビティは syslogd に送信されるため、名前付きパイプを作成し、そこに syslog トラフィックを送信して、ストリームで IP アドレスの更新を監視できます。「man syslogd」および「man syslog.conf」を参照してください。
編集: 別のアプローチは、inotify を使用してインターフェイスの DHCP リース ファイルを監視することです。/var/lib/dhcp3 ディレクトリにある Ubuntu 9.10 の下。
DD-WRTを実行しているルーターがあり、ルーターにアクセスするときにステータスページを使用している場合、スクリプトを使用して...ステータスページを取得し、IPアドレスをcatし、比較のためにファイルに書き込みます。最新の wget IP アドレスが比較ファイルの内容から変更されたときにメールを送信します。
linksys wrt54g ルーターで dd-wrt を実行しており、このスクリプトを使用しています。192.168.3.1 からルーター ステータス ページを取得し、ページ (index.html) で cat を使用し、wan IP アドレスを grep してから、次のように書き込みます。ファイル (gotip.txt)。
キャプチャされた ip (gotip.txt) と現在の作業 ip (workingip.txt) の間で比較が行われます。IP アドレスが異なる場合、send mail によって新しい IP のメールが送信され、新しい作業 IP が workingip.txt ファイルに書き込まれます。
これを 5 分ごとに Cron で実行すると、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
最新の Linux ディストリビューションでは、dbus を使用してこれを行うことができると思います。ディストリビューションで NetworkManager を使用している場合、その dbus インターフェイスに関する情報については、次のドキュメントを参照してください。
http://people.redhat.com/dcbw/NetworkManager/NetworkManager%20DBUS%20API.txt