Llamar script después de conectarse a una red inalámbrica

14

¿Hay alguna forma de llamar a un script de shell una vez que me conecto a una red inalámbrica específica? La razón por la que quiero hacer esto es que tengo que iniciar sesión en la red antes de poder comenzar a usarla y me gustaría automatizar esto si es posible.

Leí esta pregunta: ¿hay alguna forma de ejecutar un script cada vez que me conecto a una red inalámbrica específica?

Pero realmente no estoy seguro de cómo usar el advenedizo para hacerlo.

Brock Dute
fuente

Respuestas:

16

Disculpas por mi respuesta anterior, que era la forma en que lo habría hecho hace años. Parece que las cosas han cambiado.

Resulta que Network Manager ejecuta TODOS los scripts en el /etc/NetworkManager/dispatcher.d/directorio (aquellos propiedad de root, que son ejecutables, que otros usuarios no pueden leer, y no setuid), cuando una conexión cambia (arriba, abajo, preup, predown) .

El administrador de red establece y pasa las variables de entorno a este script. Te interesará la variable de entorno CONNECTION_UUID (contiene una cadena única).

Entonces, para resolver su problema (ejecute un script cuando una red inalámbrica particular esté conectada):

1) encuentre el uuid de la conexión inalámbrica que le interesa (buscando dentro del archivo de conexión apropiado en el /etc/NetworkManager/system-connections/directorio).

2) escriba un script bash (o perl, o python, o lo que sea) que haga lo que quiera si la variable de entorno CONNECTION_UUID coincide con el uuid de la red inalámbrica en (1) anterior.

3) coloque este script /etc/NetworkManager/dispatcher.d/y configure el propietario y los permisos de manera adecuada.

lectura adicional: man networkmanager (y un poco hurgando en los scripts en los directorios mencionados anteriormente).

Un script de ejemplo:

#!/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
fuente
Hola, no hay nada en / etc / NetworkManager / system-connections. Aparentemente, el UUID solo se almacena allí si la conexión es nueva (nunca utilizada antes). Sin embargo, conseguí que funcionara creando un script bash en /etc/network/if-up.d. Sin embargo, ejecuta el script en cualquier red inalámbrica a la que me conecto, pero lo solucioné haciendo iwconfig | grep -q "algunos SSID". Sin embargo, gracias por el golpe hacia la dirección correcta, ¡no lo habría descubierto sin su ayuda!
Brock Dute el
también funciona para mi instalación de gentoo, gracias por el consejo :)
Jeffrey04
En Ubuntu 16.04. /etc/NetworkManager/dispatcher.d/01ifupdownejecuta scripts en /etc/networking/if-*directorios
Peter
Gracias por la información. En lugar de codificar un UUID en mi script (que quiero ser portátil para múltiples computadoras portátiles), utilicé greplos archivos de conexiones del sistema. Funciona bien Algo así como essid=$(grep -l "uuid=$CONNECTION_UUID" /etc/NetworkManager/system-connections/*)seguido por essid=$(basename $essid).
David Faure
¿Es posible hacer esto por usuario? Me gustaría seleccionar automáticamente la configuración de la impresora en función de la red conectada actualmente. ( askubuntu.com/questions/1204645/… )
Ketil Malde
1

No sé si hay una manera de hacerlo con Network Manager, probablemente haya una, pero tengo otra solución para usted. Puedes instalar Wicd:

sudo apt-get install wicd

Wicd tiene soporte directamente en la interfaz gtk para agregar soporte previo y posterior a cada red que pueda conectarse. Tenga cuidado de que Wicd desinstale Network-Manager para que funcione (ambos están en conflicto), por lo que si algo sale mal, debe descargar el .deb de Network-Manager o tener un Live-CD / Live-USB con usted.

Wicd es fácil de usar y más rápido de conectar, pero carece de algunas características avanzadas de Network-Manager (como VPN). Aquí hay una captura de pantalla :

Wicd

Nyamiou The Galeanthrope
fuente
1

Sí, los scripts de Shell /etc/NetworkManager/dispatcher.d/para NetworkManager son una muy buena idea.

También hay un método Dbus con NetworkManager, más divertido, más complicado: man nm-settings.

Un resumen de argumentos de shells de la página Man de NetworkManager sobre dispatcher:

Cada script recibe dos argumentos, el primero es el nombre de la interfaz del dispositivo que se acaba de activar y el segundo una acción.

La acción puede ser: arriba, abajo, vpn-up, vpn-down, nombre de host, dhcp4-change, dhcp6-change. (Lanzamiento de la página del manual: 17 de enero de 2012)

Aquí hay un script muy simple para reiniciar OpenVPN después de que una interfaz de red fue up:

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