每当我的计算机进入或退出无线网络时,我都会尝试使用/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{[email protected]};
my $pass = q{myPass};
my $sms = q{[email protected]};
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 - 它已被关闭。我可以让这个脚本预先执行吗(我认为这是文件夹所做的if-down.d
)或者以某种方式编辑某些内容以使其工作?请注意,手动运行 Perl 脚本时大约需要 3 秒钟才能触发。
FWIW:我通过单击 NetworkManager 小程序并单击“断开连接”来手动关闭网络。我也可以关闭我的路由器来测试这一点,但我不知道手动断开连接和 AP 不再存在之间是否有区别。
答案1
尝试将“断开连接”脚本移至/etc/network/if-post-down.d,这是 NetworkManager 断开连接时应该实际运行的目录,而不是下拉列表(这意味着在设备关闭时触发某些操作,而不是在设备断开连接时触发某些操作)。对于您要实现的目标,这应该不是问题,事实上,避免在默认网关可能尚未更新时尝试通过网络发送短信。
这显然假设您还有另一个连接(有线)来发送短信。其他任何方式都太不确定和不可靠,不值得使用(您不能指望在运行脚本以通过无线连接发送短信时,无线连接能够正常工作)。
如果你想进一步研究这个问题,你可以看看/etc/NetworkManager/dispatcher.d/01ifupdown。