আপনার স্থানীয় আইপি-তে কোনও পরিবর্তন হলে স্ক্রিপ্টটি কীভাবে চালানো যায়?


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--- আমি এটি ব্যবহার করি কারণ বিশ্ববিদ্যালয়ের সর্বত্র থেকে আমার স্থানীয় আইপি জানা দরকার এবং এটি প্রায়শই পরিবর্তিত হয়।

এখন পর্যন্ত এত ভাল, সিস্টেম ঠিক কাজ করে। তবে দুর্ভাগ্যক্রমে এখানকার ডিএইচসিপি কনফিগার করা হয়েছে যাতে ইন্টারফেসের ডাউন / আপ ছাড়াই আইপি একসময় পরিবর্তন করা যায় । সেক্ষেত্রে স্ক্রিপ্টটি (যৌক্তিকভাবে) চালিত হয় না এবং ফাইলটি আপডেট হয় না।

আমি একটি ডাইনডিএনএস পদ্ধতির ব্যবহার করতে পারি না কারণ পরিবর্তনটি স্থানীয় আইপিতে রয়েছে, বাহ্যিকভাবে দৃশ্যমান নয়।

আমি স্পষ্টভাবে ক্রোনটিতে স্ক্রিপ্ট রেখে এবং প্রতি মিনিটে এটি সম্পাদন করে বা কিছুটা জটিল জটিল লিখতে পারি (... যদি আইপি পরিবর্তন হয় তবে ফাইলটি লিখুন অন্যথায় কিছুই করবেন না) এবং এটি একটি ব্যাকগ্রাউন্ড টাস্ক হিসাবে আবার রেখেছি, তবে এটি মার্জিত নয়। সুতরাং প্রশ্নটি হ'ল:

আমার স্থানীয় আইপি পরিবর্তন হলে কোনও স্ক্রিপ্ট ট্রিগার করার কোনও উপায় আছে কি?

আপডেট 1

আমি /etc/dhcp/dhclient-enter-hooks.d/বিদ্যমান স্ক্রিপ্টের ভিত্তিতে একটি স্ক্রিপ্ট রাখার চেষ্টা করেছি /etc/dhcp/dhclient-enter-hooks.d/resolvconf, তবে এটি ট্রিগার হবে না। আমার সন্দেহ (নিশ্চিত হওয়া দরকার) যে এনএম (নেটওয়ার্ক ম্যানেজার) নিজেই ডিএইচসিপি আলোচনা চালিয়ে যাচ্ছেন, ডিএইচসিপি কমান্ড না বলে ...


1
এটা দেখে মনে হচ্ছে এটা উচিত একটি মাধ্যমে সম্ভব হবে dhclient-enter-hooks.dস্ক্রিপ্ট ... কিন্তু আমি এটা চেষ্টা না করেছি! বিদ্যমান /etc/dhcp/dhclient-enter-hooks.d/resolvconfস্ক্রিপ্টটি সিনট্যাক্সের ক্ষেত্রে এবং কী সংকেতগুলি ( "$reason" == "BOUND"সম্ভবত?) সন্ধান করার জন্য সহায়ক হতে পারে
স্টিল্ড্রাইভার

@ স্টাইলড্রাইভারের কাছে মনে হয় স্ক্রিপ্টটি ট্রিগার করা হয়নি। আমি সন্দেহ করি যে এনএম ডিএইচসিপি হ্যান্ডলিংয়ের যত্ন নেয় ... চারপাশে তাকাবে। যাই হোক ধন্যবাদ.
রোমানো

উত্তর:


10

নেটমর্কম্যানেজারের ম্যান পেজ অনুসারে, ঘটনার একটি

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

আমি মনে করি আপনি কেবল পরিবর্তন করতে পারেন

up) 

প্রতি

dhcp4-change|up)

এটি (সাজানো) কাজ করে। স্ক্রিপ্টটি কিছুটা বেশি ট্রিগার হয়েছে; এমনকি আইপি পরিবর্তন ছাড়াই একটি নবায়নও এটি ট্রিগার করবে। আমি ভাবছি আমাকে আরও কিছু বাশ স্ক্রিপ্টিং করতে হবে। নৈতিক: ম্যান পৃষ্ঠার সমস্ত সামগ্রী পড়ুন !
রোমানো

কিছুটা অপেক্ষা করবেন (আপনি কখনই জানেন না ...) এবং তারপরে অনুগ্রহটি অর্পণ করুন। ধন্যবাদ!
রোমানো

14.04-এ আমার অভিজ্ঞতা হিসাবে, আমি কেবল কখনও কখনও সেইভাবে উপরে এবং নীচে ইভেন্টগুলি পেতে পারি। অন্যান্য ইভেন্টগুলি কখনই আপডেটে স্ক্রিপ্টগুলি ট্রিগার করে না
init_js

4

আমি একটি স্ক্রিপ্ট সরবরাহ করছি যা ডিবিস সিগন্যালগুলিতে শোনায়, যা আপনাকে আপনার বর্তমান নেটওয়ার্ক কনফিগারেশনের পরিবর্তনের জন্য ভোট দেওয়ার চেয়ে দ্রুত প্রতিক্রিয়া জানাতে দেবে। এটি এমন সিস্টেমে সহায়তা করে যেখানে স্ক্রিপ্টগুলি / ইত্যাদি / কার্যকর করা হয় না যখন আপনি তাদের পছন্দ করতে চান (আমার 14.04 সিস্টেমে পছন্দ করুন)।

আমার প্রবেশ / প্রস্থান hooks.d কাজ করে না

নেটওয়ার্কম্যানেজারটি পতাকা সহ dhclient শুরু করে -sf /usr/lib/NetworkManager/nm-dhcp-client.actionযা মনে হয় স্বাভাবিক প্রবেশ / প্রস্থান হুক আচরণকে ওভাররাইড করে। ডিএইচসিলেট সহ ডিফল্ট আচরণ হ'ল স্ক্রিপ্টগুলিতে কল করা /etc/dhcp/dhclient-{enter,exit}-hooks.d। এগুলি আমার সিস্টেমে মোটেই কল করে না।

আমার নেটওয়ার্কম্যানেজার dispatcher.d স্ক্রিপ্টগুলিও কাজ করে না

এনএম বিভিন্ন স্ক্রিপ্টের বিভিন্ন সেটকে /etc/NetworkManager/dispatcher.dবিভিন্ন ইভেন্টের কথা জানাতে অনুরোধ করে। নেটওয়ার্কম্যানেজার (8) ম্যান পেজটি সংজ্ঞায়িত করে dhcp4-changeএবং dhcp6-changeক্রিয়াগুলি যা আপনি যা চান ঠিক তেমন করে বলে মনে হয়। ম্যানপেজ যা বলেছে তা সত্ত্বেও, কমপক্ষে আমার সিস্টেমে কেবলমাত্র upএবং downক্রিয়াগুলি আমন্ত্রণ জানায়। আমি এই স্ক্রিপ্টগুলিতে অন্য কোনও কিছুতে গুলি চালাতে পারি না। আইপি পরিবর্তনগুলি নিরীক্ষণ করার জন্য এটি কোনও দুর্দান্ত উপায় নয়।

সুতরাং, সরাসরি এনএম দ্বারা নির্গত ডিবিাস সংকেতগুলিতে স্নুপ করুন

nm-dhcp-client.action( উত্স ), কমান্ড লাইন থেকে, dhclient দ্বারা নির্ধারিত সমস্ত পরিবেশের ভেরিয়েবলগুলি একটি dbus সংকেতে রূপান্তরিত করে। সেই পরিবেশের ভেরিয়েবলগুলি man dhclient-script(8) এ সংজ্ঞায়িত করা হয়েছে । বিশেষ আগ্রহের একটি $new_ip_address। @ বার্নহার্ডের পরামর্শ অনুসারে আপনি যা করতে পারেন তা হ'ল সিগন্যালটি পর্যবেক্ষণ করা এবং এর বিষয়বস্তুর উপর ভিত্তি করে কাজ করা।

এখানে এমন একটি প্রোগ্রাম রয়েছে যা সেই বাইনারি দ্বারা চিহ্নিত সমস্ত ইভেন্টের ডেটা স্নুপ করবে:

#!/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, এবং সেখান থেকে পরিবর্তিত তথ্য (যেমন আইপি বা আইফোনফিগ) পেতে বিভিন্ন সরঞ্জাম ব্যবহার করুন।

# 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"
)
...

ইহাকে একটি লাথি দাও!


অনেক ধন্যবাদ! ভাগ্যক্রমে (আমার জন্য) আমি ঘরে ফিরে এসেছি যেখানে আমি আমার ডিএইচসিপি সার্ভারটি নিয়ন্ত্রণ করতে পারি ... তবে আমি এটিকে একটি শট দেব কারণ ডিবাস সম্পর্কে জানার বিষয়টি আমার কাতারে একটি জিনিস, এবং আপনার এক দুর্দান্ত শুরু।
রোমানো

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

যদিও নেটওয়ার্কম্যানেজার dhclient ব্যবহার করছে, এটি dhclient- স্ক্রিপ্টগুলির প্রতিস্থাপন হিসাবে নিজস্ব বাইনারি সরবরাহ করে। (রেফারেন্সের জন্য: আপনি এখানে এনএম বাইনারি খুঁজে পেতে পারেন /usr/lib/NetworkManager/nm-dhcp-client.action)।

হতে পারে আপনি অন্য কোনও পদ্ধতি গ্রহণ করতে পারেন: এনএম সমস্ত ইভেন্টের জন্য একটি ডিবিাস সিগন্যাল জারি করছে। আপনি অ্যাপ্রোপিয়েট ইভেন্টের জন্য সিস্টেম ডিবিতে শুনতে পারেন এবং এর ভিত্তিতে আপনার স্ক্রিপ্টটি ট্রিগার করতে পারেন ...

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.