Script de chamada após conectar-se a uma rede sem fio


14

Existe uma maneira de chamar um shell script depois que eu me conectar a uma rede sem fio específica? O motivo pelo qual desejo fazer isso é que preciso fazer login na rede antes de poder começar a usá-la e gostaria de automatizar isso, se possível.

Eu li esta pergunta: Existe uma maneira de executar um script toda vez que eu me conecto a uma rede sem fio específica?

Mas não tenho muita certeza de como usar o upstart para fazer isso.

Respostas:


16

Desculpas pela minha resposta anterior, que era a maneira que eu teria feito anos atrás. Parece que as coisas mudaram.

Acontece que o Network Manager executa TODOS os scripts no /etc/NetworkManager/dispatcher.d/diretório (aqueles de propriedade de raiz, que são executáveis, que não são legíveis por outros usuários e não configurados), quando uma conexão é alterada (ativa, inativa, pré-operatória) .

As variáveis ​​de ambiente são definidas e transmitidas para esse script pelo gerenciador de rede. Você estará interessado na variável de ambiente CONNECTION_UUID (contém uma sequência única).

Portanto, para resolver seu problema (execute um script quando uma rede sem fio específica estiver conectada):

1) descubra o uuid da conexão sem fio em que você está interessado (olhando dentro do arquivo de conexão apropriado no /etc/NetworkManager/system-connections/diretório).

2) escreva um script bash (ou perl, ou python, ou o que for) que faça o que você deseja se a variável de ambiente CONNECTION_UUID corresponder ao uuid da rede sem fio em (1) acima.

3) coloque esse script /etc/NetworkManager/dispatcher.d/e defina o proprietário e as permissões adequadamente.

leitura adicional: man networkmanager (e um litte bisbilhotando os scripts nos diretórios mencionados acima).

Um script de exemplo:

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

Ei, não há nada em / etc / NetworkManager / system-connections. Aparentemente, o UUID só é armazenado lá se a conexão for nova (nunca usada antes). No entanto, consegui funcionar criando um script bash em /etc/network/if-up.d. Ele executa o script em qualquer rede sem fio à qual eu me conecto, mas eu trabalhei em torno dele fazendo iwconfig | grep -q "algum SSID". Obrigado pela colisão na direção certa, porém, não teria descoberto sem a sua ajuda!
Brock Dute

trabalha para minha instalação do Gentoo também, obrigado pela dica :)
Jeffrey04

No Ubuntu 16.04. /etc/NetworkManager/dispatcher.d/01ifupdownexecuta scripts em /etc/networking/if-*diretórios
peter

Obrigado pela informação. Em vez de codificar um UUID no meu script (que eu quero ser portátil para vários laptops), usei grepnos arquivos de conexão do sistema. Funciona bem. Algo como essid=$(grep -l "uuid=$CONNECTION_UUID" /etc/NetworkManager/system-connections/*)seguido por essid=$(basename $essid).
David Faure

É possível fazer isso por usuário? Gostaria de selecionar automaticamente a configuração da impressora com base na rede atualmente conectada. ( askubuntu.com/questions/1204645/… )
Ketil Malde em

1

Não sei se existe uma maneira de fazer isso com o Network Manager, provavelmente existe uma, mas tenho outra solução para você. Você pode instalar o Wicd:

sudo apt-get install wicd

O Wicd tem suporte diretamente na interface gtk para adicionar suporte pré e pós-script a todas as redes que você pode conectar. Certifique-se de que o Wicd desinstale o Network-Manager para funcionar (ambos estão em conflito); portanto, se algo der errado, você deverá baixar o .deb do Network-Manager ou ter um Live-CD / Live-USB com você.

O Wicd é fácil de usar e mais rápido para conectar, mas faltam alguns recursos avançados do Network-Manager (como VPN). Aqui está uma captura de tela :

Wicd


1

Sim, os scripts de shell do /etc/NetworkManager/dispatcher.d/NetworkManager são uma ótima idéia.

Há também um método Dbus com NetworkManager, mais divertido, mais complicado: man nm-settings.

Um resumo dos argumentos de shells da página de manual do NetworkManager sobre dispatcher:

Cada script recebe dois argumentos, o primeiro sendo o nome da interface do dispositivo que acabou de ser ativado, e o segundo, uma ação.

A ação pode ser: para cima, para baixo, vpn-up, vpn-down, nome do host, dhcp4-change, dhcp6-change. (Lançamento da página do manual: 17 de janeiro de 2012)

Aqui está um script muito simples para reiniciar o OpenVPN após uma interface de rede up:

if [ "$2" = "up" ]; then  
       /etc/init.d/openvpn restart  
fi  
exit $? 
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.