Сценарий вызова после подключения к беспроводной сети


14

Есть ли способ вызвать сценарий оболочки после подключения к определенной беспроводной сети? Причина, по которой я хочу это сделать, заключается в том, что мне нужно войти в сеть, прежде чем я смогу начать его использовать, и я хотел бы автоматизировать это, если это возможно.

Я прочитал этот вопрос: есть ли способ запускать сценарий каждый раз, когда я подключаюсь к определенной беспроводной сети?

Но я действительно не уверен, как использовать выскочку, чтобы сделать это.

Ответы:


16

Извиняюсь за мой предыдущий ответ, который я бы сделал несколько лет назад. Кажется, все изменилось.

Оказывается, что Network Manager запускает ВСЕ сценарии в /etc/NetworkManager/dispatcher.d/каталоге (принадлежащие пользователю root, которые являются исполняемыми, которые не могут быть прочитаны другими пользователями и не установлены) при изменении соединения (up, down, preup, predown) ,

Переменные среды устанавливаются и передаются в этот сценарий администратором сети. Вас заинтересует переменная окружения CONNECTION_UUID (содержит уникальную строку).

Итак, чтобы решить вашу проблему (выполнить скрипт, когда к определенной беспроводной сети подключено):

1) выясните uuid беспроводного соединения, в котором вы заинтересованы (заглянув внутрь соответствующего файла подключения в /etc/NetworkManager/system-connections/каталоге).

2) написать сценарий bash (или perl, или python, или любой другой), который делает то, что вы хотите, если переменная окружения CONNECTION_UUID соответствует uuid беспроводной сети в (1) выше.

3) вставьте этот скрипт /etc/NetworkManager/dispatcher.d/и установите владельца и права доступа соответственно.

дальнейшее чтение: man networkmanager (и немного ковыряюсь в скриптах в каталогах, упомянутых выше).

Пример скрипта:

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

Эй, в / etc / NetworkManager / system-connections ничего нет. По-видимому, UUID хранится там только в том случае, если соединение новое (никогда ранее не использовалось). Тем не менее, я заставил его работать, создав скрипт bash в /etc/network/if-up.d. Он запускает скрипт в любой беспроводной сети, к которой я подключаюсь, но я обошел его, выполнив iwconfig | grep -q "некоторый SSID". Спасибо за удар в правильном направлении, но я бы не понял это без вашей помощи!
Brock Dute

работает и для моей установки gentoo, спасибо за совет :)
Jeffrey04

На Ubuntu 16.04. /etc/NetworkManager/dispatcher.d/01ifupdownвыполняет сценарии в /etc/networking/if-*каталогах
питер

Спасибо за информацию. Вместо жесткого кодирования UUID в моем сценарии (который я хочу переносить на несколько ноутбуков) я использовал grepфайлы системных подключений. Работает красиво. Нечто подобное essid=$(grep -l "uuid=$CONNECTION_UUID" /etc/NetworkManager/system-connections/*)последовало essid=$(basename $essid).
Дэвид Фор

Возможно ли это сделать для каждого пользователя? Я хочу автоматически выбрать конфигурацию принтера в зависимости от подключенной сети. ( askubuntu.com/questions/1204645/… )
Кетил Малде

1

Я не знаю, есть ли способ сделать это с помощью Network Manager, возможно, есть один, но у меня есть другое решение для вас. Вы можете установить Wicd:

sudo apt-get install wicd

Wicd имеет поддержку непосредственно в интерфейсе gtk для добавления поддержки до сценария и после сценария в каждую сеть, к которой вы можете подключиться. Позаботьтесь о том, чтобы Wicd деинсталлировал Network-Manager для работы (они оба конфликтуют), поэтому, если что-то пойдет не так, вам следует скачать .deb Network-Manager или взять с собой Live-CD / Live-USB.

Wicd прост в использовании и быстрее подключается, но в нем отсутствуют некоторые расширенные функции Network-Manager (например, VPN). Вот скриншот:

Wicd


1

Да, сценарии оболочки /etc/NetworkManager/dispatcher.d/для NetworkManager - очень хорошая идея.

Существует также метод Dbus с NetworkManager, больше удовольствия, чем сложнее: man nm-settings.

Резюме аргументов оболочек из Man-страницы NetworkManager о dispatcher:

Каждый сценарий получает два аргумента, первый - имя интерфейса только что активированного устройства, а второй - действие.

Действие может быть: вверх, вниз, vpn-up, vpn-down, имя хоста, dhcp4-change, dhcp6-change. (Выпуск справочной страницы: 17 января 2012 г.)

Вот очень простой скрипт для перезапуска OpenVPN после того, как сетевой интерфейс был up:

if [ "$2" = "up" ]; then  
       /etc/init.d/openvpn restart  
fi  
exit $? 
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.