Wywołaj skrypt po podłączeniu do sieci bezprzewodowej


14

Czy istnieje sposób na wywołanie skryptu powłoki po połączeniu się z określoną siecią bezprzewodową? Powód, dla którego chcę to zrobić, polega na tym, że muszę się zalogować do sieci, zanim zacznę z niej korzystać i chciałbym to zautomatyzować, jeśli to możliwe.

Przeczytałem to pytanie: Czy istnieje sposób na uruchomienie skryptu przy każdym połączeniu z określoną siecią bezprzewodową?

Ale nie jestem pewien, jak użyć do tego celu narzędzia Upstart.

Odpowiedzi:


16

Przepraszam za moją poprzednią odpowiedź, tak jak zrobiłbym to lata temu. Wygląda na to, że coś się zmieniło.

Okazuje się, że Network Manager uruchamia WSZYSTKIE skrypty w /etc/NetworkManager/dispatcher.d/katalogu (te należące do roota, które są wykonywalne, które nie są czytelne dla innych użytkowników i nie są setuid), gdy zmienia się połączenie (góra, dół, preup, predown) .

Zmienne środowiskowe są ustawiane i przekazywane do tego skryptu przez Menedżera sieci. Będziesz zainteresowany zmienną środowiskową CONNECTION_UUID (zawiera unikalny ciąg).

Aby rozwiązać problem (uruchom skrypt, gdy dana sieć bezprzewodowa jest podłączona):

1) znajdź identyfikator użytkownika interesującego Cię połączenia bezprzewodowego (zaglądając do odpowiedniego pliku połączenia w /etc/NetworkManager/system-connections/katalogu).

2) napisz skrypt bash (lub perl, python lub cokolwiek innego), który robi to, co chcesz, jeśli zmienna środowiskowa CONNECTION_UUID jest zgodna z identyfikatorem UUID sieci bezprzewodowej w (1) powyżej.

3) włóż ten skrypt /etc/NetworkManager/dispatcher.d/i odpowiednio ustaw właściciela i uprawnienia.

dalsza lektura: menedżer sieci man (i trochę grzebiąc po skryptach w wyżej wymienionych katalogach).

Przykładowy skrypt:

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

Hej, w / etc / NetworkManager / system-connection nie ma nic. Najwyraźniej identyfikator UUID jest tam przechowywany tylko wtedy, gdy połączenie jest nowe (nigdy wcześniej nie używane). Mimo to udało mi się go uruchomić, tworząc skrypt bash w /etc/network/if-up.d. Uruchamia skrypt w dowolnej sieci bezprzewodowej, z którą się łączę, ale obejrzałem go, wykonując iwconfig | grep -q "jakiś identyfikator SSID". Dzięki, że wpadłeś w dobrym kierunku, nie wymyśliłbyś tego bez twojej pomocy!
Brock Dute,

działa również dla mojej instalacji Gentoo, dziękuję za podpowiedź :)
Jeffrey04

W systemie Ubuntu 16.04. /etc/NetworkManager/dispatcher.d/01ifupdownwykonuje skrypty w /etc/networking/if-*katalogach
Peter

Dzięki za informację. Zamiast na stałe wpisywać UUID w moim skrypcie (który chcę być przenośny na wiele laptopów), użyłem grepplików połączenia systemowego. Działa ładnie. Coś jak essid=$(grep -l "uuid=$CONNECTION_UUID" /etc/NetworkManager/system-connections/*)następuje essid=$(basename $essid).
David Faure

Czy można to zrobić dla poszczególnych użytkowników? Chciałbym automatycznie wybrać konfigurację drukarki w oparciu o aktualnie podłączoną sieć. ( askubuntu.com/questions/1204645/… )
Ketil Malde

1

Nie wiem, czy można to zrobić za pomocą Network Managera, prawdopodobnie istnieje, ale mam dla ciebie inne rozwiązanie. Możesz zainstalować Wicd:

sudo apt-get install wicd

Wicd ma wsparcie bezpośrednio w interfejsie GTK, aby dodać obsługę przedskryptową i poskryptową do każdej sieci, do której można się podłączyć. Uważaj, aby Wicd odinstalował Network-Managera do pracy (oba są w konflikcie), więc jeśli coś pójdzie nie tak, powinieneś pobrać .deb Network-Managera lub mieć ze sobą Live-CD / Live-USB.

Wicd jest łatwy w użyciu i szybszy do połączenia, ale brakuje mu niektórych zaawansowanych funkcji Network-Managera (takich jak VPN). Oto zrzut ekranu:

Wicd


1

Tak, skrypty Shell /etc/NetworkManager/dispatcher.d/dla NetworkManager są bardzo dobrym pomysłem.

Istnieje również metoda DBus z NetworkManager, więcej zabawy, więcej skomplikowane: man nm-settings.

Podsumowanie argumentów powłoki ze strony Man NetworkManager na temat dispatcher:

Każdy skrypt otrzymuje dwa argumenty, pierwszy to nazwa interfejsu właśnie aktywowanego urządzenia, a drugi to akcja.

Można wykonać następujące czynności: góra, dół, VPN-up, VPN-down, nazwa hosta, zmiana dhcp4, zmiana dhcp6. (Wydanie strony podręcznika użytkownika: 17 stycznia 2012 r.)

Oto bardzo prosty skrypt do ponownego uruchomienia OpenVPN po tym, jak interfejs sieciowy był up:

if [ "$2" = "up" ]; then  
       /etc/init.d/openvpn restart  
fi  
exit $? 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.