Yerel IP'nizde bir değişiklik olduğunda komut dosyası nasıl çalıştırılır?


15

Yinelenen olarak işaretlemeden önce: Bu dinamik DNS veya benzeri şeylerle ilgili değildir .

Ağlarım her yükseldiğinde bir komut dosyasını nasıl çalıştıracağımı biliyorum; dizine /etc/NetworkManager/dispatcher.dböyle bir komut dosyası eklemek basit bir konudur :

#!/bin/bash

IF=$1
STATUS=$2

case "$2" in
        up)
        logger -s "NM Script up $IF triggered"
        su rmano -c /home/romano/bin/myscript 
        ;;
        down)
        logger -s "NM Script down $IF triggered"
        ;;
        *)
        ;;
esac

Benim durumumda, myscriptçok basit ifconfig -a > ~/Dropbox/myifconfig.txt--- kullanıyorum çünkü yerel IP adresimi üniversitenin her yerinden bilmem gerekiyor ve sık sık değişecek.

Şimdiye kadar iyi, sistem iyi çalışıyor. Ancak ne yazık ki buradaki DHCP, IP'nin bir aşağı / yukarı olmadan değiştirileceği şekilde yapılandırıldı arayüzde . Bu durumda komut dosyası (mantıksal olarak) çalıştırılmaz ve dosya güncellenmez.

Bir DynDNS yaklaşımı kullanamıyorum çünkü değişiklik yerel IP'de değil, harici olarak görülebilir bir yaklaşımda.

Ben sadece cron içine script koymak ve her dakika yürütmek ya da biraz daha karmaşık bir yazmak (... IP değiştirilirse dosya yazmak başka bir şey yapmayın) ve tekrar bir arka plan görevi olarak koyarak, anket olabilir ama zarif değil. Soru şu:

Yerel IP adresim değiştiğinde bir komut dosyasını tetiklemenin bir yolu var mı?

GÜNCELLEME 1

/etc/dhcp/dhclient-enter-hooks.d/Mevcut bir senaryo, bir komut dosyası koymak için çalıştı /etc/dhcp/dhclient-enter-hooks.d/resolvconf, ancak tetiklenmez. NM (ağ yöneticisi), dhcp komutunu çağırmadan kendi başına dhcp görüşmesini yaptığını sanıyorum (onay gerekli) ...


1
o gibi görünüyor gereken bir yoluyla mümkün dhclient-enter-hooks.dkomut ... ama hiç denemedim! Varolan /etc/dhcp/dhclient-enter-hooks.d/resolvconfkomut dosyası sözdizimi ve hangi sinyalleri aramak için yararlı olabilir ( "$reason" == "BOUND"belki?)
Steeldriver

@steeldriver betiğin tetiklenmediği anlaşılıyor. NM'nin DHCP idaresiyle ilgileneceğinden şüpheleniyorum ... etrafa bakacak. Yine de teşekkürler.
Mart'ta Rmano

Yanıtlar:


10

NetmorkManager'ın kılavuz sayfasına göre, olaylardan biri

dhcp4-change
          The DHCPv4 lease has changed (renewed, rebound, etc).

Bence sen basitçe değiştirebilirsin

up) 

için

dhcp4-change|up)

Çalışır. Betik biraz fazla tetiklenir; IP'de değişiklik yapılmadan yapılan bir yenileme bile tetikleyecektir. Biraz daha bash senaryosu yapmak zorunda kalacağımı düşünüyorum. Ahlaki: man sayfasının tüm içeriğini okuyun !
Mart'ta Rmano

Biraz bekleyecek (asla bilemezsin ...) ve sonra ödül atar. Teşekkürler!
Mart'ta Rmano

14.04'teki tecrübelerime göre, sadece bu şekilde yukarı ve aşağı olayları alabilirim. diğer olaylar güncellemede komut dosyalarını asla tetiklemez. d
init_js

4

Geçerli ağ yapılandırmanızdaki değişiklikler için yoklama yapmaktan daha hızlı tepki vermenizi sağlayacak dbus sinyallerini dinleyen bir komut dosyası sağlıyorum. Komut dosyalarının / etc / komutunun istediğiniz zaman yürütülmediği sistemlerde yardımcı olur (14.04 sistemimde olduğu gibi).

giriş / çıkış kancalarım. çalışmıyor

NetworkManager dhclient'i -sf /usr/lib/NetworkManager/nm-dhcp-client.actionnormal giriş / çıkış kanca davranışını geçersiz kılan bayrakla başlatır . Dhclient ile varsayılan davranış komut dosyalarını içeri çağırmaktır /etc/dhcp/dhclient-{enter,exit}-hooks.d. Bunlar benim sistemimde hiç aranmıyor.

NetworkManager dispatcher.d komut dosyalarım da çalışmıyor

Ancak NM, /etc/NetworkManager/dispatcher.dçeşitli olayları bildirmek için farklı bir komut dizisi çağırır . NetworkManagerın (8) kılavuz sayfasına tanımlarınızı dhcp4-changeve dhcp6-changene istediğinizi tam olarak yapmak gibi görünüyor eylemleri. Manpage'in söylediklerine rağmen, en azından sistemimde sadece upve downeylemler çağrılır. Bu senaryoları başka bir şeye ateşleyemem. Yani bu IP değişikliklerini izlemek için de harika bir yol değil.

bu nedenle, NM tarafından yayılan dbus sinyallerine doğrudan göz atın

nm-dhcp-client.action( kaynak ) komut satırından dhclient tarafından ayarlanan tüm ortam değişkenlerini bir dbus sinyaline dönüştürür. Bu ortam değişkenleri man dhclient-script(8) ' de tanımlanmıştır . Özel ilgi alanlarından biri $new_ip_address. @Bernhard tarafından önerildiği gibi yapabileceğiniz şey, sinyali izlemek ve içeriğine göre hareket etmektir.

İşte bu ikili tarafından sinyal verilen tüm olay verilerini göz ardı edecek bir program:

#!/bin/bash -e

#
# This script listens for the org.freedesktop.nm_dhcp_client signal.
# The signal is emitted every time dhclient-script would execute.
# It has the same contents as the environment passed to
# dhclient-script (8). Refer to manpage for variables of interest.
#

# "org.freedesktop.nm_dhcp_client" is an undocumented signal name,
# as far as I could tell. it is emitted by nm-dhcp-client.action,
# which is from the NetworkManager package source code.
# 

# detail: todo cleanup subprocess on exit. if the parent exits, 
#       the subprocess will linger until it tries to print
#       at which point it will get SIGPIPE and clean itself.
#       trap on bash's EXIT signal to do proper cleanup.


mkfifo /tmp/monitor-nm-change

(
    dbus-monitor --system "type='signal',interface='org.freedesktop.nm_dhcp_client'"
) > /tmp/monitor-nm-change &

exec </tmp/monitor-nm-change
rm /tmp/monitor-nm-change

while read EVENT; do
    #change this condition to the event you're interested in
    if echo "$EVENT" | grep -q BOUND6; then
        # do something interesting
        echo "current ipv6 addresses:"
        ip addr show | grep inet6
    fi
done

Dbus monitörünün çıkışı komut dosyalarında ayrıştırmak için kolay değildir. Belki belirli bir anahtar kelimelerin varlığını tetiklemek daha kolaydır, örneğin new_ip_addressoradan değişen bilgileri almak için farklı araçlar kullanın (örneğin ip veya ifconfig).

# example output data from dbus-monitor for that signal
...
dict entry(
string "new_routers"
variant             array of bytes "192.168.2.11"
)
dict entry(
string "new_subnet_mask"
variant             array of bytes "255.255.255.0"
)
dict entry(
string "new_network_number"
variant             array of bytes "192.168.2.0"
)
dict entry(
string "new_ip_address"
variant             array of bytes "192.168.2.4"
)
dict entry(
string "pid"
variant             array of bytes "12114"
)
dict entry(
string "reason"
variant             array of bytes "REBOOT"
)
dict entry(
string "interface"
variant             array of bytes "eth0"
)
...

Bi dene!


Çok teşekkürler! Neyse ki (benim için) DHCP sunucumu kontrol edebileceğim eve döndüm ... ama bir şans vereceğim çünkü DBus hakkında bilgi edinmek benim kuyruğumdaki şeylerden biri ve seninki harika bir başlangıç.
Rmano

3

Python betiği ile yoklama yaklaşımı. Temel fikir, ip -4 -o add show <INTERFACE>mevcut sonucu önceki yinelemeyle sürekli olarak ayrıştırmak ve karşılaştırmaktır

#!/usr/bin/env python3
import subprocess
import sys

def get_ip():
    # Simple function that parses output
    # of ip command and returns interface ip
    # replace wlan7 with your interface
    command = 'ip -4 -o addr show wlan7'.split()
    ip = None
    try:
        ip = subprocess.check_output(command).decode().split()[3]
    except IndexError:
        return
    finally:
        if ip:
           return ip

def main():
    # do while loop
    # Exits only when change occurs
    address = get_ip()
    while address == get_ip():
          address = get_ip()

    # Trigger script once we're out of loop
    subprocess.call(['zenity','--info','--text','IP CHANGED'])


if __name__ == '__main__':
    # use while loop if yout want this script to run
    # continuously
    while True:
        try:
            main()
        except KeyboardInterrupt:
            sys.exit()

1

NetworkManager dhclient kullanıyor olsa da, dhclient komut dosyalarının yerine kendi ikili dosyalarını sağlar. (Referans için: NM ikilisini adresinde bulabilirsiniz /usr/lib/NetworkManager/nm-dhcp-client.action).

Belki farklı bir yaklaşım kullanabilirsiniz: NM, tüm olaylarda bir DBus sinyali yayınlamaktadır. Uygun olay için sistem DBus'u dinleyebilir ve betiğinizi buna dayalı olarak tetikleyebilirsiniz ...

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.