![连接无线网络后调用脚本](https://linux22.com/image/1074635/%E8%BF%9E%E6%8E%A5%E6%97%A0%E7%BA%BF%E7%BD%91%E7%BB%9C%E5%90%8E%E8%B0%83%E7%94%A8%E8%84%9A%E6%9C%AC.png)
有没有办法在连接到特定无线网络后调用 shell 脚本?我想要这样做的原因是我必须先登录网络才能开始使用它,如果可能的话,我想自动执行此操作。
我读过这个问题:有没有办法在我每次连接到特定无线网络时运行脚本?
但我真的不确定如何使用 upstart 来做到这一点。
答案1
抱歉,我之前的回答是我几年前会回答的。看来情况已经改变了。
事实证明,/etc/NetworkManager/dispatcher.d/
当连接发生变化(up、down、preup、predown)时,网络管理器会运行目录中的所有脚本(由 root 拥有的、可执行的、其他用户不可读的、不是 setuid 的脚本)。
环境变量由网络管理器设置并传递给此脚本。您将对 CONNECTION_UUID 环境变量(包含一个唯一字符串)感兴趣。
因此,要解决您的问题(当连接到特定无线网络时执行脚本):
1)找出您感兴趣的无线连接的 uuid(通过查看目录中的相应连接文件/etc/NetworkManager/system-connections/
)。
2)编写一个 bash(或 perl、python 或其他)脚本,如果环境变量 CONNECTION_UUID 与上面(1)中的无线网络的 uuid 匹配,则执行您想要的操作。
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 $?
答案2
我不知道是否有办法使用网络管理器来实现这一点,可能有,但我还有另一个解决方案。您可以安装 Wicd:
sudo apt-get install wicd
Wicd 直接在 gtk 界面上支持向您可以连接的每个网络添加前脚本和后脚本支持。请注意,Wicd 将卸载 Network-Manager 才能工作(它们都存在冲突),因此如果出现问题,您应该下载 Network-Manager 的 .deb 或随身携带 Live-CD/Live-USB。
Wicd 易于使用且连接速度更快,但缺少 Network-Manager 的一些高级功能(如 VPN)。以下是屏幕截图:
答案3
/etc/NetworkManager/dispatcher.d/
是的, NetworkManager中的 Shell 脚本是一个非常好的主意。
还有一种用NetworkManager的Dbus方法,更有趣,也更复杂:man nm-settings
。
NetworkManager 手册页中关于 shell 参数的总结如下dispatcher
:
每个脚本接收两个参数,第一个是刚刚激活的设备的接口名称,第二个是动作。
操作可以是:up、down、vpn-up、vpn-down、hostname、dhcp4-change、dhcp6-change。(手册页发布日期:2012 年 1 月 17 日)
这是一个非常简单的脚本,用于在网络接口发生故障后重新启动 OpenVPN up
:
if [ "$2" = "up" ]; then
/etc/init.d/openvpn restart
fi
exit $?