जब आपके स्थानीय IP में कोई परिवर्तन होता है तो स्क्रिप्ट कैसे चलाएं?


15

डुप्लिकेट के रूप में चिह्नित करने से पहले: यह डायनेमिक DNS या इसी तरह की चीजों के बारे में नहीं है

मुझे पता है कि हर बार मेरे नेटवर्क के ऊपर स्क्रिप्ट चलाने का तरीका क्या है; यह /etc/NetworkManager/dispatcher.dइस तरह एक निर्देशिका में एक स्क्रिप्ट को जोड़ने का एक सरल मामला है :

#!/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

मेरे मामले में, myscriptएक बहुत ही सरल है ifconfig -a > ~/Dropbox/myifconfig.txt--- मैं इसका उपयोग करता हूं क्योंकि मुझे विश्वविद्यालय में हर जगह से अपने स्थानीय आईपी को जानने की आवश्यकता है, और यह अक्सर बदल जाएगा।

अब तक अच्छा, सिस्टम ठीक काम करता है। लेकिन दुर्भाग्य से यहाँ डीएचसीपी को कॉन्फ़िगर किया गया है ताकि आईपी कभी-कभी इंटरफ़ेस के डाउन / अप के बिना बदल जाए । उस स्थिति में स्क्रिप्ट (तार्किक रूप से) नहीं चलती है, और फ़ाइल अपडेट नहीं होती है।

मैं एक DynDNS दृष्टिकोण का उपयोग नहीं कर सकता क्योंकि परिवर्तन स्थानीय आईपी ​​में है, बाहरी रूप से दिखाई देने वाला नहीं है।

मैं मतदान कर सकता हूं, बस स्क्रिप्ट को क्रोन में डालकर और इसे हर मिनट निष्पादित कर सकता हूं या थोड़ा अधिक जटिल लिख सकता हूं (... यदि आईपी बदल दिया गया है तो फ़ाइल को लिखें अन्यथा कुछ भी नहीं करें) और इसे फिर से एक पृष्ठभूमि कार्य के रूप में डाल दें, लेकिन यह सुरुचिपूर्ण नहीं है तो सवाल यह है:

क्या कोई स्क्रिप्ट को ट्रिगर करने का कोई तरीका है जब मेरा स्थानीय आईपी बदलता है?

अद्यतन १

मैंने /etc/dhcp/dhclient-enter-hooks.d/मौजूदा के आधार पर एक स्क्रिप्ट डालने की कोशिश की /etc/dhcp/dhclient-enter-hooks.d/resolvconf, लेकिन इसे ट्रिगर नहीं किया जाएगा। मुझे संदेह है (पुष्टि की आवश्यकता है) कि एनएम (नेटवर्क मैनेजर) खुद से dhcp बातचीत कर रहा है, बिना dhpp कॉल ...


1
ऐसा लगता है कि यह एक स्क्रिप्ट के माध्यम से संभव होना चाहिए dhclient-enter-hooks.d... लेकिन मैंने कभी कोशिश नहीं की है! मौजूदा /etc/dhcp/dhclient-enter-hooks.d/resolvconfस्क्रिप्ट वाक्य रचना के संदर्भ में उपयोगी हो सकता है और क्या संकेत देखने के लिए ( "$reason" == "BOUND"शायद?)
steeldriver

@steeldriver ऐसा लगता है कि स्क्रिप्ट ट्रिगर नहीं है। मुझे संदेह है कि NM DHCP हैंडलिंग का ध्यान रखता है ... चारों ओर देखेगा। फिर भी धन्यवाद।
रमानो

जवाबों:


10

NetmorkManager के लिए मैन पेज के अनुसार, घटनाओं में से एक है

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

मुझे लगता है कि आप बस बदल सकते हैं

up) 

सेवा

dhcp4-change|up)

यह (सॉर्ट-इन) काम करता है। स्क्रिप्ट को थोड़ा बहुत भी ट्रिगर किया गया है; यहां तक ​​कि आईपी में बदलाव के बिना एक नवीनीकरण भी इसे ट्रिगर करेगा। मुझे लगता है कि मुझे थोड़ी और बैश स्क्रिप्टिंग करनी पड़ेगी। Moral: मैन पेज की सभी सामग्री पढ़ें !
रमनो

थोड़ा इंतजार करेंगे (आप कभी नहीं जानते ...) और फिर इनाम आवंटित करें। धन्यवाद!
रमनो

14.04 पर मेरे अनुभव में, मैं कभी भी इस तरह से ऊपर और नीचे की घटनाओं को प्राप्त कर सकता हूं। अन्य घटनाओं update.d में कभी नहीं ट्रिगर स्क्रिप्ट
init_js

4

मैं एक स्क्रिप्ट प्रदान कर रहा हूं जो डबस संकेतों पर सुनती है, जो आपको तेजी से प्रतिक्रिया करने की अनुमति देगा यदि आप अपने नेटवर्क नेटवर्क कॉन्फ़िगरेशन में बदलाव के लिए मतदान कर रहे थे। यह उन प्रणालियों पर मदद करता है जहां स्क्रिप्ट / आदि / निष्पादित नहीं किए जाते हैं जब आप उन्हें पसंद करेंगे (जैसे मेरे 14.04 सिस्टम पर)।

मेरा प्रवेश / निकास हुकसेड काम नहीं करता है

NetworkManager उस झंडे के साथ धीरज शुरू करता है -sf /usr/lib/NetworkManager/nm-dhcp-client.actionजो सामान्य प्रवेश / निकास हुक व्यवहार को ओवरराइड करने लगता है। Dhclient के साथ डिफ़ॉल्ट व्यवहार में स्क्रिप्ट को कॉल करना है /etc/dhcp/dhclient-{enter,exit}-hooks.d। उन सभी को मेरे सिस्टम पर नहीं बुलाया जाता है।

मेरा NetworkManager dispatcher.d स्क्रिप्ट या तो काम नहीं करता है

हालाँकि, /etc/NetworkManager/dispatcher.dविभिन्न घटनाओं की सूचना देने के लिए, स्क्रिप्ट्स का एक अलग सेट है । NetworkManager (8) मैन पेज परिभाषित करता है dhcp4-changeऔर ऐसे dhcp6-changeकार्य करता है जो आपको वही चाहिए जो आप चाहते हैं। मैंन्यू के कहने के बावजूद, मेरे सिस्टम पर, कम से कम, केवल upऔर downएक्शन का ही इस्तेमाल किया जाता है। मैं उन लिपियों को किसी और चीज़ में आग नहीं लगा सकता। तो यह आईपी परिवर्तनों की निगरानी के लिए एक महान एवेन्यू नहीं है।

इसलिए, NM द्वारा उत्सर्जित dbus संकेतों पर सीधे स्नूप करें

nm-dhcp-client.action( स्रोत ), कमांड लाइन से, बस dhclient द्वारा निर्धारित सभी पर्यावरण चर को एक डबस सिग्नल में परिवर्तित करता है। उन पर्यावरण चर को man dhclient-script(8) में परिभाषित किया गया है । विशेष रुचि में से एक है $new_ip_address। आप क्या कर सकते हैं, जैसा कि @Bernhard द्वारा सुझाया गया है, संकेत की निगरानी करना और उसकी सामग्री के आधार पर कार्य करना है।

यहां एक कार्यक्रम है जो उस बाइनरी द्वारा संकेतित सभी घटना डेटा को स्नूप करेगा:

#!/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

स्क्रिप्ट में पार्स करने के लिए डब-मॉनिटर का आउटपुट सीधा नहीं है। शायद एक निश्चित कीवर्ड (ओं) की उपस्थिति पर ट्रिगर करना आसान है, उदाहरण के लिए new_ip_address, और वहां से अलग-अलग टूल का उपयोग करके उस जानकारी को प्राप्त किया जा सकता है (जैसे आईपी या 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"
)
...

इसे आजमा कर देखें!


आपका बहुत बहुत धन्यवाद! सौभाग्य से (मेरे लिए) मैं घर पर वापस आ गया हूं जहां मैं अपने डीएचसीपी सर्वर को नियंत्रित कर सकता हूं ... लेकिन मैं इसे एक शॉट दूंगा क्योंकि DBus के बारे में सीखना मेरी कतार में से एक है, और आपकी एक शानदार शुरुआत है।
19

3

अजगर स्क्रिप्ट के साथ मतदान दृष्टिकोण। मूल विचार आउटपुट को निरंतर बनाए रखना है ip -4 -o add show <INTERFACE>और पिछले पुनरावृत्ति के साथ वर्तमान परिणाम की तुलना करना है

#!/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 का उपयोग कर रहा है, यह अपने स्वयं के बायनेरिज़ को dhclient-स्क्रिप्ट के प्रतिस्थापन के रूप में प्रदान करता है। (संदर्भ के लिए: आप एनएम बाइनरी पर पा सकते हैं /usr/lib/NetworkManager/nm-dhcp-client.action)।

शायद आप एक अलग तरीका अपना सकते हैं: NM सभी घटनाओं पर DBus संकेत जारी कर रहा है। आप एपप्रॉपिएट इवेंट के लिए सिस्टम DBus पर सुन सकते हैं और इसके आधार पर अपनी स्क्रिप्ट को ट्रिगर कर सकते हैं ...

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.