我需要在我的路由器上输入scipt并查找代码并与之前记录的此IP信息进行比较,如果没有更改,则停止脚本。
我运行这个脚本 - $ perl~ / test.pl
没有错误,但未创建文件my_ip.txt。
在原件脚本必须通过主机example.dyndns.org检查我的IP,但我的IP是灰色的。
所以我需要通过路由器来确定
#!/usr/bin/perl
use LWP::UserAgent;
my $routeraddress = `addr admin:Tavolzhansky@192.168.1.1/RST_conn_status.htm`;
if ($routeraddress =~ /var info_get_wanip="((\d+\.){3}(\d+))"/) {
my $ip = "$1.$2.$3.$4";
#Добавлено:
open (FILE,"my_ip.txt");
my @lines = <FILE>;
$old_ip = $lines[0]; #Считываем IP из файла
$old_ip =~ s/^\s+|\s+$//g; #trim
close(FILE);
if ($old_ip eq $ip) {
die "IP not changed"; # Выходим из скрипта, если IP не изменился
}
open (FILE,">my_ip.txt");
print FILE $ip; # Записываем в файл новый IP
close(FILE);
...... (this code is OK)
}
由于连接到路由器的问题
,请不要结束代码答案 0 :(得分:7)
$ perl -cw -e 'print `addr admin:foo@192.168.1.1/bar`'
Possible unintended interpolation of @192 in string at -e line 1.
-e syntax OK
它不起作用,因为@192
被插值为数组,并且您正在运行命令addr admin:Tavolzhansky.168.1.1/RST_conn_status.htm
而不是您想要的命令。
如果您要use warnings
,如果您将使用调试器逐步执行代码,或者如Andy所建议的那样,如果您要检查返回值,则很容易发现并修复。
要让@192
无法插值,请转义@
:
my $routeraddress = `addr admin:Tavolzhansky\@192.168.1.1/RST_conn_status.htm`;
答案 1 :(得分:2)
由于这个原因,它无法正常工作:
my $routeraddress = `addr admin:Tavolzhansky@192.168.1.1/RST_conn_status.htm`;
if ($routeraddress =~ /var info_get_wanip="((\d+\.){3}(\d+))"/) {
...
}
尝试添加几个调试打印以确认:
my $routeraddress = `addr admin:Tavolzhansky@192.168.1.1/RST_conn_status.htm`;
print "Router IP = $routeraddress/n";
if ($routeraddress =~ /var info_get_wanip="((\d+\.){3}(\d+))"/) {
...
} else {
print "Router address didn't match.\n";
}
您应该使用严格和警告编译指示,但正如您所说,当您从其他来源获取IP时,此工作正常,其余代码将起作用。
我猜你正在阅读HTML页面,希望在某个地方看到这个字符串:
var info_get_wanip="xxx.xxx.xxx.xxx";
但是,你需要确认$ routeraddress是否真正得到了它,它看起来像是
my $routeraddress = `addr admin:Tavolzhansky@192.168.1.1/RST_conn_status.htm`;
实际上只是对页面发出get请求,但是没有返回&#34; var info_get_wanip =&#34; xxx.xxx.xxx.xxx&#34 ;;&#34;。如果你对变量$ routeraddress的赋值进行排序,那么它就可以工作。
我无法说出如何,因为我不知道它现在回来了。