我正在运行 Kubuntu 12.10 64 位。我试图在断开网络连接时执行一个 bash 脚本。我在/etc/network/if-down.d/
名为的文件夹中创建了一个名为的文件test
,其中只有一行:
zenity --info --text="network down!"
我可以毫无问题地执行此脚本;/etc/network/if-down.d/test
在终端中输入会导致弹出一个消息框,提示“网络已关闭!”。当我通过网络管理器断开与 wifi 网络的连接时,什么也没有发生。拔下 wifi usb 加密狗也不会导致出现该消息框。我唯一的猜测是,无论出于什么原因,脚本都/etc/network/if-down.d/
没有被执行。添加#!/bin/bash
为第一行也不起作用。
编辑:2013-01-02
我在使用 gertvdijk 的答案时遇到了一些问题(旧的编辑和评论混在一起了),现在这些问题已经解决了。运行zenity
并su
解决DISPLAY=:0
了我的问题。
答案1
如果您正在使用网络管理器(而不是命令行/etc/network/interfaces
文件),那么您应该使用网络管理器调度程序脚本。
只需将脚本放入/etc/NetworkManager/dispatcher.d/
目录中,方法与此类似if-down.d
。使用网络管理器调度程序脚本编写脚本相当容易,我建议阅读此(基本)示例,该示例发布在建筑维基:
#!/bin/sh
INTERFACE=$1 # The interface which is brought up or down
STATUS=$2 # The new state of the interface
USERNAME=gert # ENTER YOUR USERNAME HERE
case "$STATUS" in
'up') # $INTERFACE is up
# you could do something here...
;;
'down') # $INTERFACE is down
# Check for other active interfaces and only act on all down
if [ ! `nm-tool|grep State|cut -f2 -d' '` = "connected" ]; then
/bin/su -l ${USERNAME} -c 'DISPLAY=:0 /usr/bin/zenity --info --text="all network interfaces down"'
fi
;;
esac
对于特定网络的操作,请参阅这个答案。
并确保重新启动网络管理器以使用该新脚本。
sudo service network-manager restart
答案2
我尝试了一下(在 10.04 上),但遇到了同样的问题。看来脚本不知道在哪个显示器上显示对话框。
尝试用以下方法替换您的线路:
DISPLAY=0:0 zenity --info --text="network down!"
(如果您有多个显示器,则可能需要更精巧的东西。)
答案3
其他答案都很棒 - 可能比这个更好,但是,像往常一样,还有另一种方法可以做到这一点 - 这次不需要系统实用程序或提升的权限(sudo)。
我的系统运行的是 kubuntu 12.04,所以这段代码可能在你的系统上也能用。它也应该能在 gnome 2.x 上用,只是自动启动脚本的位置不同。
我遇到过类似的问题,我想知道我的电脑什么时候离线(因为我的笔记本似乎偶尔会通过自行禁用 wifi 来做到这一点,而且我经常没有注意到任务栏中的小红色 x。)
我所做的是将一个小的(可执行)脚本添加到 ~/.kde/Autostart 目录,该脚本在每次 KDE 启动时运行我的主脚本(这负责使用显示器和键盘):
#!/bin/bash
if [ -x "$HOME/bin/offline_alert" ] ; then
offline_alert &
fi
主要脚本,离线警报,使用 ping 测试我是否处于离线状态,并重试几次以避免误报,然后使用 yad(与 zenity 相同,但功能更强大!)生成弹出窗口并播放声音。在测试在线状态变化期间,它会休眠,这样就不会占用太多资源。
如果您从命令行等手动运行它,它会检查它是否已在运行并为您提供结束它的选项。
测试离线的代码位于“离线”功能中,因此可以轻松修改而不会影响脚本的其余部分。
它使用的图像、图标和声音都是硬编码的,所以你必须自己替换。我在网上找到了一个很酷的 wifi 离线图标。
它会创建一个您可能想要或不想要的日志文件。
该脚本设置为使用通知,但代码被注释掉了,因为通知消失得太快,似乎带来的麻烦多于帮助。
这只是另一种方法,也许有人会发现该代码很有用。
乔