2011-12-17 9 views
9

Linux'ta IP Adresinde herhangi bir değişiklik olduğunda bildirim almak için geri arama veya sinyal gibi bir yöntem var. Kernel ile bir geri arama kaydetmek veya otomatik olarak yapılmakta olan çekirdeğe bir sinyal almak istiyorum. peşinIP adresi değişikliği için bildirim nasıl alınır

teşekkürler.

+0

Udev'e bakıyorum –

+0

Udev bunu gerçekten önemsemiyor. –

cevap

16

Çekirdekden, netlink soketleriyle bildirim alırsınız.

Bir NETLINK_ROUTE soket oluşturmak ve RTMGRP_IPV4_IFADDR grubuna ing bind() aracılığıyla değişiklikleri IP bunu abone gerekir

. Daha sonra, IFA_LOCAL veya IFA_ADDRESS yol özniteliğine sahip RTM_NEWADDR ve RTM_DELADDR türlerinin netlink iletilerini alırsınız.

1

"/ sbin/ip monitörünü" bir alt işlem olarak üretebilir ve çıktısını izleyebilirsiniz.

IP adresleri değiştiğinde vb. Size söyleyecektir. Daha fazla bilgi için ip (8) için man sayfasına bakın. C programlama olmadan

3

:

$ ip monitor 

onun stdout'ta çıktı üretir komut, zaman IP alt sistemi değişiklikleri bazı yapılandırma. Komut

# ip addr add 10.10.10.10/24 dev em1 

# ip addr del 10.10.10.10/24 dev em1 

aşağıdaki çıktı üretmesi

Deleted 2: em1 inet 10.10.10.10/24 scope global em1 
Deleted 10.10.10.0/24 dev em1 proto kernel scope link src 10.10.10.10 
Deleted broadcast 10.10.10.255 dev em1 table local proto kernel scope link src 10.10.10.10 
Deleted broadcast 10.10.10.0 dev em1 table local proto kernel scope link src 10.10.10.10 
Deleted local 10.10.10.10 dev em1 table local proto kernel scope host src 10.10.10.10 

kullanabilirsiniz üreten komutla 10.10.10.10 adrese posta silme şu çıktıyı

2: em1 inet 10.10.10.10/24 scope global em1 
local 10.10.10.10 dev em1 table local proto kernel scope host src 0.10.10.10 
10.10.10.0/24 dev em1 proto kernel scope link src 10.10.10.10 
broadcast 10.10.10.0 dev em1 table local proto kernel scope link src 10.10.10.10 
broadcast 10.10.10.255 dev em1 table local proto kernel scope link src 10.10.10.10 

üretir eit Bu mesajları işlemek için kabuğu ve bazı awk veya perl veya popen() ve arkadaşlarınızın C kütüphanesi işlevlerini kullanabilir ve çıkışları C.'de kullanabilirsiniz.

C programlama kullanarak, NETLINK aracılığıyla çekirdeğe bağlanabilirsiniz. Bu oldukça karmaşık ve çok iyi belgelenmiyor. Netlink arayüzüne bir başlangıç ​​noktası için bu Wikipedia article'a bakın.