Rufen Sie das Skript auf, nachdem Sie eine Verbindung zu einem WLAN hergestellt haben

14

Gibt es eine Möglichkeit, ein Shell-Skript aufzurufen, sobald ich eine Verbindung zu einem bestimmten drahtlosen Netzwerk hergestellt habe? Der Grund, warum ich dies tun möchte, ist, dass ich mich erst beim Netzwerk anmelden muss, bevor ich es verwenden kann. Wenn möglich, möchte ich dies automatisieren.

Ich habe die folgende Frage gelesen: Gibt es eine Möglichkeit, ein Skript jedes Mal auszuführen, wenn ich eine Verbindung zu einem bestimmten drahtlosen Netzwerk herstelle?

Aber ich bin mir wirklich unsicher, wie ich Emporkömmling verwenden soll, um es zu tun.

Brock Dute
quelle

Antworten:

16

Entschuldigung für meine vorherige Antwort, wie ich es vor Jahren getan hätte. Scheint, als hätten sich die Dinge geändert.

Es stellt sich heraus, dass Network Manager ALLE Skripte im /etc/NetworkManager/dispatcher.d/Verzeichnis ausführt (die im Besitz von root sind, die ausführbar sind, von anderen Benutzern nicht gelesen werden können und nicht setuid), wenn sich eine Verbindung ändert (aufwärts, abwärts, vorab, vorab). .

Umgebungsvariablen werden vom Netzwerkmanager festgelegt und an dieses Skript übergeben. Sie interessieren sich für die Umgebungsvariable CONNECTION_UUID (enthält eine eindeutige Zeichenfolge).

So lösen Sie Ihr Problem (führen Sie ein Skript aus, wenn eine Verbindung zu einem bestimmten drahtlosen Netzwerk besteht):

1) Finden Sie die UUID der Funkverbindung heraus, an der Sie interessiert sind (indem Sie in die entsprechende Verbindungsdatei im /etc/NetworkManager/system-connections/Verzeichnis schauen ).

2) Schreiben Sie ein Bash-Skript (oder Perl-, Python- oder was auch immer), das das tut, was Sie wollen, wenn die Umgebungsvariable CONNECTION_UUID mit der UUID des drahtlosen Netzwerks in (1) oben übereinstimmt.

3) /etc/NetworkManager/dispatcher.d/Setzen Sie dieses Skript in und stellen Sie den Eigentümer und die Berechtigungen entsprechend ein.

Lesen Sie weiter: man networkmanager (und ein wenig stöbern in den Skripten in den oben genannten Verzeichnissen).

Ein Beispielskript:

#!/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 $?
finley
quelle
Hey, in / etc / NetworkManager / system-connections ist nichts. Anscheinend wird die UUID nur dort gespeichert, wenn die Verbindung neu ist (noch nie benutzt). Trotzdem habe ich es zum Laufen gebracht, indem ich ein Bash-Skript in /etc/network/if-up.d erstellt habe. Es führt das Skript in jedem drahtlosen Netzwerk aus, zu dem ich eine Verbindung herstelle, aber ich habe es mit iwconfig | umgangen grep -q "einige SSID". Vielen Dank für die Beule in die richtige Richtung, hätte es aber nicht ohne Ihre Hilfe herausgefunden!
Brock Dute 20.11.10
funktioniert auch für meine Gentoo-Installation, danke für den Tipp :)
Jeffrey04
Auf Ubuntu 16.04. /etc/NetworkManager/dispatcher.d/01ifupdownführt Skripte in /etc/networking/if-*Verzeichnissen
Peter
Danke für die Auskunft. Anstatt eine UUID in meinem Skript fest zu codieren (die auf mehrere Laptops portierbar sein soll), habe ich grepdie Systemverbindungsdateien verwendet. Funktioniert gut. So etwas wie essid=$(grep -l "uuid=$CONNECTION_UUID" /etc/NetworkManager/system-connections/*)gefolgt von essid=$(basename $essid).
David Faure
1

Ich weiß nicht, ob es eine Möglichkeit gibt, dies mit Network Manager zu tun. Es gibt wahrscheinlich eine, aber ich habe eine andere Lösung für Sie. Sie können Wicd installieren:

sudo apt-get install wicd

Wicd hat Unterstützung direkt auf der GTK-Oberfläche, um jedem Netzwerk, das Sie verbinden können, Pre-Script- und Post-Script-Unterstützung hinzuzufügen. Achten Sie darauf, dass Wicd den Network-Manager deinstalliert, damit er funktioniert (beide Konflikte). Wenn also etwas schief geht, sollten Sie die .deb des Network-Managers herunterladen oder eine Live-CD / Live-USB mit sich führen.

Wicd ist einfach zu bedienen und schneller zu verbinden, es fehlen jedoch einige erweiterte Funktionen von Network-Manager (wie VPN). Hier ist ein Screenshot:

Wicd

Nyamiou der Galeanthrope
quelle
1

Ja, Shell-Skripte in /etc/NetworkManager/dispatcher.d/ für NetworkManager sind eine sehr gute Idee.

Es gibt auch eine Dbus-Methode mit NetworkManager, die unterhaltsamer und komplizierter ist: man nm-settings .

Eine Zusammenfassung der Argumente aus der Manpage von NetworkManager zu Shells dispatcher :

Jedes Skript erhält zwei Argumente, das erste ist der Schnittstellenname des gerade aktivierten Geräts und das zweite eine Aktion.

Aktion kann sein: hoch, runter, vpn-hoch, vpn-runter, Hostname, dhcp4-Änderung, dhcp6-Änderung. (Veröffentlichung der Manpage: 17. Januar 2012)

Hier ist ein sehr einfaches Skript, um OpenVPN neu zu starten, nachdem eine Netzwerkschnittstelle war up:

if [ "$2" = "up" ]; then  
       /etc/init.d/openvpn restart  
fi  
exit $? 
Yvan
quelle