Сценарій виклику після підключення до бездротової мережі


14

Чи є у мене спосіб викликати скрипт оболонки, коли я підключаюся до певної бездротової мережі? Причина: я хочу це зробити - це я повинен увійти в мережу, перш ніж я можу почати її використовувати, і я хотів би автоматизувати це, якщо це можливо.

Я читав це запитання: чи існує спосіб запустити скрипт щоразу, коли я підключаюся до бездротової мережі specifc?

Але я дійсно не впевнений у тому, як скористатись початком для цього.

Відповіді:


16

Вибачте за свою попередню відповідь, якою я це зробив би роки тому. Здається, все змінилося.

Виявляється, що Менеджер мережі запускає ВСІ скрипти в /etc/NetworkManager/dispatcher.d/каталозі (ті, що належать root, які виконуються у виконанні, які не читаються іншими користувачами та не встановлені), коли з’єднання змінюється (вгору, вниз, попередньо підготується, попередньо встановлено) .

Менеджер мережі встановлює і передає цьому сценарію змінні середовища. Вас зацікавить змінна середовище CONNECTION_UUID (містить унікальну рядок).

Отже, для вирішення вашої проблеми (виконайте сценарій, коли певна бездротова мережа підключена):

1) з'ясуйте uuid бездротового з'єднання, яке вас цікавить (заглянувши всередину відповідного файлу з'єднання в /etc/NetworkManager/system-connections/каталозі).

2) написати bash (або perl, python, або будь-який інший) сценарій, який виконує те, що ви хочете, якщо змінна середовища CONNECTION_UUID відповідає сумісності з uuid бездротової мережі в (1) вище.

3) введіть цей скрипт /etc/NetworkManager/dispatcher.d/і встановіть власника та дозволи.

подальше читання: man networkmanager (і літ, що копається навколо сценаріїв у вищезгаданих каталогах).

Приклад сценарію:

#!/bin/bash
#####################################
# MounterBeast Script
# /etc/NetworkManager/dispatcher.d/02remotemount
# Copyright 2011 Nathan E. Williams
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
# Usage:
# This script must be customized for your configuration.
# By default, the script will attempt to mount a CIFS share
# when a specified MAC address is found at the network gateway,
# or over sshfs if the MAC address of the gateway is not the specified MAC.
# e.g. I mount over CIFS to the servers internal IP when at home, and
# over sshfs when away from home.
#
# id gateway mac without physically checking the sticker:
# $ arp -n -a $(ip route show 0.0.0.0/0 | awk '{print $3}') | awk '{print $4}'
#
# Testing:
# up) sudo /etc/NetworkManager/dispatcher.d/02remotemount wlan0 up
# down) sudo /etc/NetworkManager/dispatcher.d/02remotemount wlan0 down
#####################################
#
# Configuration:
#
targetmac='xx:xx:xx:xx:xx:xx'
mount_user='$USER'
mount_pass='pass'
internal_server_name='192.168.1.102'
external_server_name='my.dyndns.com'
share_name="music"
mount_point='/mnt/remote'
ssh_port='22'
#
# Should not need to edit below
#
gateway=$(ip route show 0.0.0.0/0 | awk '{print $3}')
mactest=$(arp -n -a $gateway | awk '{print $4}')

if [[ "$mactest" == "$targetmac" ]]
then
  case "$2" in
          up)
          sleep 5
          mount -t cifs -o username=$mount_user,password=$mount_pass //$internal_server_name/$share_name $mount_point
          ;;
          down)
          umount -l $mount_point
          ;;
  esac
else
  case "$2" in
      up)
          sleep 5
          sshfs -p $ssh_port $external_server_name:$share_name $mount_point
      ;;
      down)
          umount -l $mount_point
      ;;
  esac
fi

exit $?

Гей, у / etc / NetworkManager / system-з'єднання нічого немає. Мабуть, UUID зберігається там лише в тому випадку, якщо з'єднання нове (ніколи раніше не використовувалося). Тим не менш, я змусив його працювати, створивши bash-скрипт у /etc/network/if-up.d. Він запускає скрипт у будь-якій бездротовій мережі, до якої я підключаюся, але я працював над ним, роблячи iwconfig | grep -q "деякий SSID". Дякуємо за удару в потрібному напрямку, але не зрозуміли б це без вашої допомоги!
Brock Dute

працює і для моєї установки gentoo, дякую за пораду :)
Jeffrey04

У Ubuntu 16.04. /etc/NetworkManager/dispatcher.d/01ifupdownвиконує сценарії в /etc/networking/if-*каталогах
peter

Спасибі за інформацію. Замість жорсткого кодування UUID в моєму сценарії (який я хочу переносити на декілька ноутбуків), я використовував grepфайли системних з'єднань. Працює чудово. Щось на кшталт essid=$(grep -l "uuid=$CONNECTION_UUID" /etc/NetworkManager/system-connections/*)цього essid=$(basename $essid).
Девід Форе

Чи можливо це зробити на основі кожного користувача? Я хотів би автоматично вибрати конфігурацію принтера на основі поточно підключеної мережі. ( askubuntu.com/questions/1204645/… )
Ketil Malde

1

Я не знаю, чи є спосіб це зробити з Менеджером мережі, можливо, є, але у мене є інше рішення для вас. Ви можете встановити Wicd:

sudo apt-get install wicd

Wicd має підтримку безпосередньо на gtk-інтерфейсі, щоб додати підтримку до скрипту та пост-скрипту до кожної мережі, до якої можна підключитися. Слідкуйте за тим, щоб Wicd деінсталював Network Manager для роботи (вони обоє в конфлікті), тому, якщо щось піде не так, вам слід завантажити .deb Network-Manager або мати при собі компакт-диск / Live-USB.

Wicd простий у використанні та швидше підключення, але не має деяких розширених функцій Network-Manager (наприклад, VPN). Ось скріншот:

Wicd


1

Так, сценарії оболонки /etc/NetworkManager/dispatcher.d/для NetworkManager - дуже гарна ідея.

Існує також метод Dbus з NetworkManager, більше задоволення, ніж складніше: man nm-settings.

Резюме аргументів оболонок з сторінки Man у NetworkManager про dispatcher:

Кожен скрипт отримує два аргументи, перший - ім'я інтерфейсу пристрою, щойно активований, а другий - дія.

Дія може бути: вгору, вниз, vpn-up, vpn-вниз, ім'я хоста, dhcp4-change, dhcp6-change. (Випуск довідкової сторінки: 17 січня 2012 р.)

Ось дуже простий скрипт для перезапуску OpenVPN після того, як мережевий інтерфейс up:

if [ "$2" = "up" ]; then  
       /etc/init.d/openvpn restart  
fi  
exit $? 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.