Как запустить скрипт, когда существует изменение в Вашем локальном IP?

Прежде, чем отметить как дубликат: это не о динамическом 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 ---Я использую его, потому что я должен знать свой локальный IP отовсюду в Университете, и это будет часто изменяться.

Пока неплохо система работает хорошо. Но к сожалению DHCP здесь настроен так, чтобы IP когда-то был изменен без вниз / интерфейса. В этом случае скрипт (логически) не запущен, и файл не обновляется.

Я не могу использовать подход DynDNS, потому что изменение находится в локальном IP, не внешне видимом.

Я мог опросить, путем простого помещения сценария в крон и выполнять его каждую минуту или писать немного более сложный (..., если IP изменяется, пишут, что файл иначе ничего не делает), и помещение его снова как фоновая задача, но это не изящно. Таким образом, вопрос:

Там какой-либо путь состоит в том, чтобы инициировать сценарий когда мои локальные изменения IP?

ОБНОВЛЕНИЕ 1

Я пытался вставить сценарий /etc/dhcp/dhclient-enter-hooks.d/ , на основе существующего /etc/dhcp/dhclient-enter-hooks.d/resolvconf, но это не будет инициировано. Я подозреваю (необходимое подтверждение), что NM (администратор сети) делает dhcp согласование отдельно, не называя команду dhcp...

15
задан 25 March 2014 в 19:25

4 ответа

Согласно странице справочника для NetmorkManager, одно из событий

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

, я думаю, что можно просто измениться

up) 

к

dhcp4-change|up)
10
ответ дан 16 November 2019 в 13:28

Я предоставляю сценарий, который слушает на сигналах dbus, которые позволят Вам реагировать быстрее, чем если бы необходимо было опросить относительно изменений на текущей конфигурации сети. Помогает на системах, где сценарии/etc/не выполняются, когда Вы хотели бы их к (как в моих 14,04 системах).

мои вводить/выходить hooks.d не работают

NetworkManager запускает dhclient с флага -sf /usr/lib/NetworkManager/nm-dhcp-client.action который, кажется, переопределяет нормальное, вводят/выходят поведение рычага. Поведение по умолчанию с dhclient состоит в том, чтобы призвать сценарии /etc/dhcp/dhclient-{enter,exit}-hooks.d. Они не становятся зашедшими все в моей системе.

мои сценарии NetworkManager dispatcher.d не работают также

NM действительно однако вызывает другой набор сценариев, в /etc/NetworkManager/dispatcher.d, сообщать о различных событиях. NetworkManager (8) страница справочника определяет dhcp4-change и dhcp6-change действия, которые, казалось бы, сделали бы точно, что Вы хотите. Несмотря на то, что страница справочника говорит, в моей системе, по крайней мере, только up и down действия вызываются. Я не могу заставить те сценарии стрелять во что-либо еще. Таким образом, это не большая авеню для наблюдения изменений IP также.

таким образом шпионьте непосредственно на сигналах dbus, испускаемых NM

nm-dhcp-client.action (источник), из командной строки, просто преобразовывает все переменные среды, установленные dhclient в сигнал dbus. Те переменные среды определяются в 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

Вывод dbus-монитора не прост для парсинга в сценариях. Возможно, легче включить присутствие определенного ключевого слова (слов), например. new_ip_address, и оттуда используйте различные инструменты для получения информации, которая изменилась (например, IP или 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"
)
...

Дайте ему выстрел!

4
ответ дан 16 November 2019 в 13:28

Опрос подхода со сценарием Python. Основная идея состоит в том, чтобы непрерывно анализировать вывод 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()
3
ответ дан 16 November 2019 в 13:28

Хотя NetworkManager использует dhclient, он обеспечивает свои собственные двоичные файлы как замену для dhclient-сценариев. (Для ссылки: можно найти двоичный файл NM в /usr/lib/NetworkManager/nm-dhcp-client.action).

, Возможно, Вы могли проявить другой подход: NM выпускает сигнал DBus на всех событиях. Вы могли послушать в системе DBus для appropiate события и инициировать Ваш сценарий на основе этого...

1
ответ дан 16 November 2019 в 13:28

Другие вопросы по тегам:

Похожие вопросы: