Làm cách nào để chạy tập lệnh khi có thay đổi trong IP cục bộ của bạn?


15

Trước khi đánh dấu là một bản sao: đây không phải là về DNS động hoặc những thứ tương tự.

Tôi biết cách chạy một kịch bản mỗi khi mạng của tôi tăng lên; một vấn đề đơn giản là thêm một tập lệnh trong thư mục /etc/NetworkManager/dispatcher.dnhư thế này:

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

Trong trường hợp của tôi, myscriptrất đơn giản ifconfig -a > ~/Dropbox/myifconfig.txt--- Tôi sử dụng nó vì tôi cần biết IP địa phương của mình từ khắp mọi nơi trong trường Đại học và nó sẽ thay đổi thường xuyên.

Cho đến nay rất tốt, hệ thống hoạt động tốt. Nhưng thật không may, DHCP ở đây được cấu hình để đôi khi IP bị thay đổi mà không có sự xuống / xuống của giao diện. Trong trường hợp đó, tập lệnh (về mặt logic) không chạy và tập tin không được cập nhật.

Tôi không thể sử dụng cách tiếp cận DynDNS vì thay đổi nằm trong IP cục bộ , không phải là cách tiếp cận bên ngoài.

Tôi có thể thăm dò ý kiến, bằng cách đơn giản đặt tập lệnh vào cron và thực thi nó mỗi phút hoặc viết một tập lệnh phức tạp hơn một chút (... nếu IP bị thay đổi, hãy viết tập tin nếu không làm gì) và đặt lại nó làm nhiệm vụ nền, nhưng nó không thanh lịch. Vì vậy, câu hỏi là:

Có cách nào để kích hoạt tập lệnh khi IP cục bộ của tôi thay đổi không?

CẬP NHẬT 1

Tôi đã cố gắng đưa một tập lệnh vào /etc/dhcp/dhclient-enter-hooks.d/, dựa trên tập lệnh hiện có /etc/dhcp/dhclient-enter-hooks.d/resolvconf, nhưng nó sẽ không được kích hoạt. Tôi nghi ngờ (cần xác nhận) rằng NM (quản lý mạng) đang tự mình thực hiện đàm phán dhcp, mà không gọi lệnh dhcp ...


1
có vẻ như nó nên có thể thông qua một dhclient-enter-hooks.dkịch bản ... nhưng tôi chưa bao giờ thử nó! /etc/dhcp/dhclient-enter-hooks.d/resolvconfKịch bản hiện tại có thể hữu ích về mặt cú pháp và những tín hiệu nào cần tìm ( "$reason" == "BOUND"có thể?)
Steeldo 20/03/2016

@steel ấn có vẻ như kịch bản không được kích hoạt. Tôi nghi ngờ rằng NM sẽ xử lý DHCP ... sẽ xem xét xung quanh. Dẫu sao cũng xin cảm ơn.
Rmano

Câu trả lời:


10

Theo trang man cho NetmorkManager, một trong những sự kiện là

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

Tôi nghĩ bạn có thể đơn giản thay đổi

up) 

đến

dhcp4-change|up)

Nó (sắp xếp) hoạt động. Kịch bản được kích hoạt thậm chí hơi quá nhiều; thậm chí gia hạn mà không thay đổi IP sẽ kích hoạt nó. Tôi tưởng tượng tôi sẽ phải làm thêm một chút kịch bản bash. Đạo đức: đọc tất cả nội dung của trang người đàn ông!
Rmano

Sẽ đợi một chút (bạn không bao giờ biết ...) và sau đó chỉ định tiền thưởng. Cảm ơn!
Rmano

theo kinh nghiệm của tôi vào ngày 14.04, tôi chỉ có thể nhận được các sự kiện theo cách đó. các sự kiện khác không bao giờ kích hoạt các tập lệnh trong update.d
init_js

4

Tôi đang cung cấp một tập lệnh lắng nghe tín hiệu dbus, điều này sẽ cho phép bạn phản ứng nhanh hơn so với khi bạn thăm dò các thay đổi về cấu hình mạng hiện tại của bạn. Nó giúp trên các hệ thống mà tập lệnh / etc / không được thực thi khi bạn muốn chúng (như trên hệ thống 14.04 của tôi).

hook enter / exit của tôi không hoạt động

NetworkManager bắt đầu dhclient với cờ -sf /usr/lib/NetworkManager/nm-dhcp-client.actiondường như ghi đè hành vi hook nhập / thoát thông thường. Hành vi mặc định với dhclient là gọi các script trong /etc/dhcp/dhclient-{enter,exit}-hooks.d. Những người không được gọi ở tất cả trên hệ thống của tôi.

Các kịch bản phân phối NetworkManager của tôi không hoạt động

Tuy nhiên, NM gọi một tập lệnh khác /etc/NetworkManager/dispatcher.dđể thông báo về các sự kiện khác nhau. Trang người dùng NetworkManager (8) xác định dhcp4-changedhcp6-changehành động dường như sẽ làm chính xác những gì bạn muốn. Bất chấp những gì manpage nói, ít nhất trên hệ thống của tôi, chỉ updowncác hành động được viện dẫn. Tôi không thể có được những kịch bản đó để bắn vào bất cứ điều gì khác. Vì vậy, đây cũng không phải là một con đường tuyệt vời để theo dõi các thay đổi IP.

vì vậy, rình mò trực tiếp vào tín hiệu dbus do NM phát ra

nm-dhcp-client.action( nguồn ), từ dòng lệnh, chỉ cần chuyển đổi tất cả các biến môi trường được đặt bởi dhclient thành tín hiệu dbus. Các biến môi trường được định nghĩa trong man dhclient-script(8). Một trong những quan tâm đặc biệt là $new_ip_address. Những gì bạn có thể làm, như được đề xuất bởi @Bernhard, là theo dõi tín hiệu và hành động phù hợp dựa trên nội dung của nó.

Đây là một chương trình sẽ theo dõi tất cả dữ liệu sự kiện được báo hiệu bởi nhị phân đó:

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

Đầu ra của màn hình dbus không đơn giản để phân tích cú pháp trong các tập lệnh. Có lẽ dễ dàng hơn để kích hoạt sự hiện diện của một (các) từ khóa nhất định, ví dụ new_ip_address, và từ đó sử dụng các công cụ khác nhau để có được thông tin đã thay đổi (ví dụ: ip hoặc 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"
)
...

Cho nó một phát!


Cảm ơn rất nhiều! May mắn thay (đối với tôi) Tôi trở về nhà, nơi tôi có thể điều khiển máy chủ DHCP của mình ... nhưng tôi sẽ thử nó vì tìm hiểu về DBus là một trong những điều trong hàng đợi của tôi và bạn là một khởi đầu tuyệt vời.
Rmano

3

Cách tiếp cận bỏ phiếu với kịch bản python. Ý tưởng cơ bản là liên tục phân tích đầu ra ip -4 -o add show <INTERFACE>và so sánh kết quả hiện tại với lần lặp trước

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

Mặc dù NetworkManager đang sử dụng dhclient, nó cung cấp các nhị phân riêng của nó để thay thế cho các tập lệnh dhclient. (Để tham khảo: bạn có thể tìm thấy nhị phân NM tại /usr/lib/NetworkManager/nm-dhcp-client.action).

Có lẽ bạn có thể thực hiện một cách tiếp cận khác: NM đang phát tín hiệu DBus trên tất cả các sự kiện. Bạn có thể nghe trên hệ thống DBus cho sự kiện chiếm đoạt và kích hoạt tập lệnh của bạn dựa trên ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.