Chiama lo script dopo esserti connesso a una rete wireless


14

C'è un modo per chiamare uno script di shell una volta che mi collego a una specifica rete wireless? Il motivo per cui voglio farlo è che devo accedere alla rete prima di poter iniziare a usarlo e vorrei automatizzare questo, se possibile.

Ho letto questa domanda: esiste un modo per eseguire uno script ogni volta che mi collego a una specifica rete wireless?

Ma non sono davvero sicuro di come usare upstart per farlo.

Risposte:


16

Mi scuso per la mia precedente risposta, che era il modo in cui l'avrei fatto anni fa. Sembra che le cose siano cambiate.

Si scopre che Network Manager esegue TUTTI gli script nella /etc/NetworkManager/dispatcher.d/directory (quelli di proprietà di root, che sono eseguibili, che non sono leggibili da altri utenti e non setuid), quando cambia una connessione (su, giù, preup, predown) .

Le variabili di ambiente vengono impostate e passate a questo script dal gestore della rete. Ti interesserà la variabile di ambiente CONNECTION_UUID (contiene una stringa univoca).

Quindi, per risolvere il tuo problema (esegui uno script quando è connessa una particolare rete wireless):

1) scopri il uuid della connessione wireless che ti interessa (guardando all'interno del file di connessione appropriato nella /etc/NetworkManager/system-connections/directory).

2) scrivi uno script bash (o perl, o python, o altro) che fa quello che vuoi se la variabile d'ambiente CONNECTION_UUID è una corrispondenza con il uuid della rete wireless in (1) sopra.

3) inserire questo script /etc/NetworkManager/dispatcher.d/e impostare il proprietario e le autorizzazioni in modo appropriato.

ulteriori letture: man networkmanager (e una litte che prende in giro gli script nelle directory sopra menzionate).

Uno script di esempio:

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

Ehi, non c'è nulla in / etc / NetworkManager / connessioni di sistema. Apparentemente, l'UUID è memorizzato lì solo se la connessione è nuova (mai usata prima). Tuttavia, l'ho fatto funzionare creando uno script bash in /etc/network/if-up.d. Esegue lo script in qualsiasi rete wireless a cui mi connetto, ma ho lavorato su di esso facendo iwconfig | grep -q "alcuni SSID". Grazie per l'urto nella giusta direzione, però, non l'avresti capito senza il tuo aiuto!
Brock Dute,

funziona anche per la mia installazione di
Gentoo

Su Ubuntu 16.04. /etc/NetworkManager/dispatcher.d/01ifupdownesegue gli script nelle /etc/networking/if-*directory
peter

Grazie per l'informazione. Invece di codificare un UUID nel mio script (che voglio essere portabile su più laptop), ho usato grepi file delle connessioni di sistema. Funziona bene. Qualcosa come essid=$(grep -l "uuid=$CONNECTION_UUID" /etc/NetworkManager/system-connections/*)seguito da essid=$(basename $essid).
David Faure,

È possibile farlo su una base per utente? Vorrei selezionare automaticamente la configurazione della stampante in base alla rete attualmente connessa. ( askubuntu.com/questions/1204645/… )
Ketil Malde,

1

Non so se c'è un modo per farlo con Network Manager, ce n'è probabilmente uno ma ho un'altra soluzione per te. Puoi installare Wicd:

sudo apt-get install wicd

Wicd ha il supporto direttamente sull'interfaccia gtk per aggiungere il supporto pre-script e post-script a ogni rete a cui è possibile connettersi. Assicurati che Wicd disinstallerà Network-Manager per funzionare (entrambi sono in conflitto), quindi se qualcosa va storto dovresti scaricare il .deb di Network-Manager o avere un Live-CD / Live-USB con te.

Wicd è facile da usare e più veloce per connettersi ma manca di alcune funzionalità avanzate di Network-Manager (come VPN). Ecco uno screenshot:

wicd


1

Sì, gli script Shell /etc/NetworkManager/dispatcher.d/per NetworkManager sono un'ottima idea.

V'è anche un metodo dBus con NetworkManager, più divertente, più complicato: man nm-settings.

Un riassunto degli argomenti di shell dalla pagina Man di NetworkManager su dispatcher:

Ogni script riceve due argomenti, il primo è il nome dell'interfaccia del dispositivo appena attivato e il secondo un'azione.

L'azione può essere: su, giù, vpn-up, vpn-down, hostname, dhcp4-change, dhcp6-change. (Rilascio della pagina man: 17 gennaio 2012)

Ecco uno script molto semplice per riavviare OpenVPN dopo un'interfaccia di rete up:

if [ "$2" = "up" ]; then  
       /etc/init.d/openvpn restart  
fi  
exit $? 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.