Script d'appel après connexion à un réseau sans fil


14

Existe-t-il un moyen pour moi d'appeler un script shell une fois connecté à un réseau sans fil spécifique? La raison pour laquelle je veux le faire est que je dois me connecter au réseau avant de pouvoir l'utiliser et je voudrais automatiser cela si possible.

J'ai lu cette question: existe-t-il un moyen d'exécuter un script chaque fois que je me connecte à un réseau sans fil spécifique?

Mais je ne sais vraiment pas comment utiliser upstart pour le faire.

Réponses:


16

Toutes mes excuses pour ma réponse précédente qui était la façon dont je l'aurais fait il y a des années. Il semble que les choses aient changé.

Il s'avère que Network Manager exécute TOUS les scripts du /etc/NetworkManager/dispatcher.d/répertoire (ceux appartenant à root, qui sont exécutables, qui ne sont pas lisibles par les autres utilisateurs, et non setuid), lorsqu'une connexion change (haut, bas, preup, predown) .

Les variables d'environnement sont définies et transmises à ce script par le gestionnaire de réseau. Vous serez intéressé par la variable d'environnement CONNECTION_UUID (contient une chaîne unique).

Donc, pour résoudre votre problème (exécutez un script lorsqu'un réseau sans fil particulier est connecté à):

1) découvrez l'uuid de la connexion sans fil qui vous intéresse (en regardant à l'intérieur du fichier de connexion approprié dans le /etc/NetworkManager/system-connections/répertoire).

2) écrire un script bash (ou perl, ou python, ou autre) qui fait ce que vous voulez si la variable d'environnement CONNECTION_UUID est une correspondance avec l'uuid du réseau sans fil dans (1) ci-dessus.

3) mettez ce script dans /etc/NetworkManager/dispatcher.d/et définissez le propriétaire et les autorisations de manière appropriée.

Lectures complémentaires: man networkmanager (et un peu fouillant les scripts dans les répertoires mentionnés ci-dessus).

Un exemple de script:

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

Hé, il n'y a rien dans / etc / NetworkManager / system-connections. Apparemment, l'UUID n'y est stocké que si la connexion est nouvelle (jamais utilisée auparavant). Néanmoins, je l'ai fait fonctionner en créant un script bash dans /etc/network/if-up.d. Il exécute le script dans n'importe quel réseau sans fil auquel je me connecte, mais j'ai travaillé autour de lui en faisant iwconfig | grep -q "certains SSID". Merci pour la bosse dans la bonne direction, je ne l'aurais pas compris sans votre aide!
Brock Dute

fonctionne aussi pour mon installation gentoo, merci pour le conseil :)
Jeffrey04

Sur Ubuntu 16.04. /etc/NetworkManager/dispatcher.d/01ifupdownexécute les scripts dans les /etc/networking/if-*répertoires
peter

Merci pour l'information. Au lieu de coder en dur un UUID dans mon script (que je veux être portable sur plusieurs ordinateurs portables), j'ai utilisé greples fichiers de connexions système. Fonctionne bien. Quelque chose comme essid=$(grep -l "uuid=$CONNECTION_UUID" /etc/NetworkManager/system-connections/*)suivi de essid=$(basename $essid).
David Faure

Est-il possible de le faire par utilisateur? Je souhaite sélectionner automatiquement la configuration de l'imprimante en fonction du réseau actuellement connecté. ( askubuntu.com/questions/1204645/… )
Ketil Malde

1

Je ne sais pas s'il existe un moyen de le faire avec Network Manager, il y en a probablement un mais j'ai une autre solution pour vous. Vous pouvez installer Wicd:

sudo apt-get install wicd

Wicd a un support directement sur l'interface gtk pour ajouter un support pré-script et post-script à chaque réseau auquel vous pouvez vous connecter. Assurez-vous que Wicd désinstallera Network-Manager pour fonctionner (ils sont tous deux en conflit) donc si quelque chose ne va pas, vous devez télécharger le .deb de Network-Manager ou avoir un Live-CD / Live-USB avec vous.

Wicd est facile à utiliser et plus rapide à connecter, mais il manque certaines fonctionnalités avancées de Network-Manager (comme VPN). Voici une capture d'écran:

Wicd


1

Oui, les scripts Shell /etc/NetworkManager/dispatcher.d/pour NetworkManager sont une très bonne idée.

Il y a aussi une méthode DBus avec NetworkManager, plus amusant, plus compliqué: man nm-settings.

Un résumé des arguments shells de la page Man de NetworkManager sur dispatcher:

Chaque script reçoit deux arguments, le premier étant le nom d'interface du périphérique qui vient d'être activé et le second une action.

L'action peut être: haut, bas, vpn-up, vpn-down, nom d'hôte, dhcp4-change, dhcp6-change. (Sortie de la page de manuel: 17 janvier 2012)

Voici un script très simple pour redémarrer OpenVPN après une interface réseau up:

if [ "$2" = "up" ]; then  
       /etc/init.d/openvpn restart  
fi  
exit $? 
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.