NetworkManager – if-down.d脚本不执行

我试图使用/etc/network/if-up.d//etc/network/if-down.d在我的计算机进入或退出无线网络时通过Gmail向我的手机发送短信。 主脚本是用Perl编写的,所述文件夹中的脚本基本上都是包装器。 这是Perl脚本, ~user/bin/laptopSMS.pl

 #!/usr/bin/perl use strict; use warnings; use Email::Send; use Email::Send::Gmail; use Email::Simple::Creator; my $addy = q{myEmail@gmail.com}; my $pass = q{myPass}; my $sms = q{myPhoneNumber@tmomail.net}; my $email = Email::Simple->create( header => [ From => $addy, To => $sms, Subject => "$ARGV[0]", ], body => "$ARGV[1] / $ARGV[2]", ); my $sender = Email::Send->new( { mailer => 'Gmail', mailer_args => [ username => $addy, password => $pass, ] } ); eval { $sender->send($email) }; die "Error sending email: $@" if $@; 

以下脚本是/etc/network/if-up.d/99postconnect_laptopSMS

 #!/bin/bash set -e if [ "$IFACE" == "wlan0" ]; then ipaddr=`ip addr | grep inet[^6] | grep -v 127.0.0.1 | awk {'print $2'} | sed 's!/[0-9]*!!g'` ssid=`iwgetid -r` ~user/bin/laptopSMS.pl "connected" "$ssid" "$ipaddr" fi 

这很好用,每当我的手机进入网络时,我都会收到短信; 但是,相应的if-down.d脚本发送“断开”信号不会:

 #!/bin/bash set -e if [ "$IFACE" == "wlan0" ]; then ~user/bin/laptopSMS.pl "disconnect" "disconnect" "disconnect" fi 

这不是执行; 我尝试将以下代码段放入脚本中以查看是否有任何实际运行:

 ifdowntest=/home/user/ifdown_test.txt date >> $ifdowntest whoami >> $ifdowntest ifconfig >> $ifdowntest sleep 5 

将它留在脚本中本身执行得很好,但是将它附加到Perl脚本的包装器却没有。 (没有生成文件。)

ifconfig >> $ifdowntest的输出显示wlan0没有IP – 它被删除了。 我可以让这个脚本执行pre-down(我认为这是if-down.d文件夹的function)或以某种方式编辑某些内容以使其工作吗? 请注意,手动运行Perl脚本需要大约3秒钟才能触发。

FWIW:我通过单击NetworkManager小程序并单击“断开连接”手动关闭网络。 我可能只是杀了我的路由器来测试它,但我不知道手动断开连接和AP不再存在之间是否存在差异。

尝试将“断开连接”脚本移动到/etc/network/if-post-down.d ,这是在NetworkManager断开连接时应该实际运行的目录,而不是if-down.d (这意味着触发某些设备作为设备)下降,而不是它刚刚断开)。 对于您要实现的目标,它应该不是问题,实际上避免尝试通过网络发送SMS,而默认网关可能尚未更新。

这显然假设您仍然有另一个连接(有线)发送短信。 其他任何东西都太不确定和不可靠而不值得使用(在运行脚本以发送短信时,你不能指望无线连接能够正常工作)。

如果您想进一步调查,可以查看/etc/NetworkManager/dispatcher.d/01ifupdown