Как запустить скрипт при изменении локального IP-адреса?

Вы хотите использовать брандмауэр для блокировки доступа к другим сайтам. Я полагаю, что UFU по умолчанию. Команда man ufw должна предоставить информацию о том, как ее использовать. Замените 192.0.2.15 адресом, который вы хотите заблокировать.

Команды

sudo ufw enable sudo ufw deny to 192.0.2.15
1
задан 25 March 2014 в 21:25

3 ответа

Подбор опроса с помощью скрипта 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
ответ дан 24 May 2018 в 10:35

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

my enter / exit hooks.d не работает

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

my enter / exit hooks.d не работает

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

, поэтому, snoop непосредственно на 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"
)
...

Дайте ему шанс!

3
ответ дан 24 May 2018 в 10:35
  • 1
    Большое спасибо! К счастью (для меня), я вернусь домой, где могу контролировать свой сервер DHCP ... но я дам ему шанс, потому что узнавать о DBus - это одна из вещей в моей очереди, а ваша - прекрасное начало. – Rmano 5 September 2016 в 22:57

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

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

1
ответ дан 24 May 2018 в 10:35

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

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