连接到无线网络后调用脚本


Answers:


16

抱歉,我以前的回答就是几年前的做法。似乎情况已经改变。

事实证明,网络管理器在 /etc/NetworkManager/dispatcher.d/,当连接发生更改(上,下,上,下,下)时目录(由root拥有的,可执行的,其他用户无法读取和setuid)。 。

环境变量由网络管理器设置并传递到此脚本。您将对CONNECTION_UUID环境变量(包含唯一字符串)感兴趣。

因此,要解决您的问题(在连接特定的无线网络时执行脚本):

1)找出您感兴趣的无线连接的uuid(通过在 /etc/NetworkManager/system-connections/目录中)。

2)如果环境变量CONNECTION_UUID与上面(1)中的无线网络的uuid相匹配,则编写一个bash(或perl,python,或其他内容)脚本来执行所需的操作。

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才会存储在此处。尽管如此,我还是通过在/etc/network/if-up.d中创建一个bash脚本来使其工作。它确实可以在我连接到的任何无线网络中运行脚本,但是我通过执行iwconfig解决了该问题。grep -q“某些SSID”。不过,感谢您朝着正确的方向前进,如果没有您的帮助,您将无法解决!
Brock Dute

也适用于我的gentoo安装,谢谢提示:)
Jeffrey04 2013年

在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)
David Faure

是否可以针对每个用户执行此操作?我想根据当前连接的网络自动选择打印机配置。(askubuntu.com/questions/1204645/...
Ketil Malde

1

我不知道是否可以通过Network Manager来实现,也许有一种方法,但是我为您提供了另一种解决方案。您可以安装Wicd:

sudo apt-get install wicd

Wicd直接在gtk界面上提供支持,以向可以连接的每个网络添加脚本前和脚本后支持。请注意,Wicd将卸载Network-Manager使其正常工作(它们都处于冲突状态),因此,如果出现问题,应下载Network-Manager的.deb或随身携带Live-CD / Live-USB。

Wicd易于使用且连接速度更快,但缺少Network-Manager的某些高级功能(例如VPN)。这是屏幕截图:

Wicd


1

是的,Shell脚本在 /etc/NetworkManager/dispatcher.d/ NetworkManager中使用是一个好主意。

NetworkManager中还有一个Dbus方法,更有趣,更复杂:man nm-settings

NetworkManager手册页中有关以下内容的shell参数的简历dispatcher

每个脚本都接收两个参数,第一个是刚激活的设备的接口名称,第二个是动作。

动作可以是:up,down,vpn-up,vpn-down,主机名,dhcp4-change,dhcp6-change。(手册页发布:2012年1月17日)

这是一个非常简单的脚本,用于在网络接口为up以下内容后重新启动OpenVPN :

if [ "$2" = "up" ]; then  
       /etc/init.d/openvpn restart  
fi  
exit $? 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.