web-dev-qa-db-fra.com

Appelez le script après vous être connecté à un réseau sans fil

Puis-je appeler un script Shell une fois que je me connecte à un réseau sans fil spécifique? La raison pour laquelle je veux faire cela est que je dois me connecter au réseau avant de pouvoir commencer à l'utiliser et j'aimerais automatiser cela si possible.

J'ai lu cette question: Y a-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.

13
Brock Dute

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

Il s’avère que Network Manager exécute TOUS les scripts du répertoire /etc/NetworkManager/dispatcher.d/ (ceux appartenant à root, qui sont exécutables, qui ne sont pas lisibles par d’autres utilisateurs et qui ne sont pas configurés), lorsqu’une connexion est modifiée (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’utilisation de la connexion sans fil qui vous intéresse (en consultant le fichier de connexion approprié dans le répertoire /etc/NetworkManager/system-connections/).

2) écrivez un script bash (ou Perl, ou python, ou autre) qui fait ce que vous voulez si la variable d’environnement CONNECTION_UUID correspond à l’uuid du réseau sans fil dans (1) ci-dessus.

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

lectures supplémentaires: man networkmanager (et une petite fouille autour des scripts des 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 $?
14
finley

Je ne sais pas s’il est possible de le faire avec Network Manager, il y en a probablement un, mais j’ai une autre solution à vous proposer. Vous pouvez installer Wicd:

Sudo apt-get install wicd

Wicd prend directement en charge l'interface gtk pour ajouter une prise en charge pré-script et post-script à chaque réseau auquel vous pouvez vous connecter. Veillez à ce que Wicd désinstallera Network-Manager (les deux sont en conflit). Si quelque chose ne va pas, vous devez télécharger le fichier .deb de Network-Manager ou vous munir d’un Live-CD/Live-USB.

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

Wicd

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

Il existe également une méthode Dbus avec NetworkManager, plus amusante, plus compliquée: man nm-settings.

Un résumé des arguments de shells de la page de manuel de NetworkManager à propos de dispatchername__:

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

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

Voici un script très simple pour redémarrer OpenVPN après qu'une interface réseau était upname__:

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