【问题标题】:What is wrong in my script, tell me please我的脚本有什么问题,请告诉我
【发布时间】:2016-03-09 18:46:23
【问题描述】:

我需要那个scipt在我的路由器页面上输入并找到代码并与之前记录的这个IP信息进行比较,如果没有更改,则停止脚本。

我运行这个脚本 - $ perl ~/test.pl

没有错误,但未创建文件 my_ip.txt。

in originals script 必须通过主机 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)
}

不要把代码结束因为连接路由器的问题

【问题讨论】:

  • 开启use strict; use warnings; 和use autodie; - 如果您的open 失败,后者将生成错误。猜测一下,权限被拒绝。
  • 使用严格;没有帮助。 old_ip 与原始版本一样出错,但它在原始版本中有效
  • addr 命令返回什么?
  • 请不要将所有perl 代码的Q 标记为bash。祝你好运。

标签: linux perl


【解决方案1】:
$ 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`;

【讨论】:

  • 有趣的事实:@192 在 Perl 中是一个有效的数组标识符,并且像 @ARGV、%SIG 或 %ENV 一样,总是被解释为在 main 包中。不能使用 my 为其指定词法范围。
【解决方案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";
}

您应该使用 strict 和 warning pragma,但正如您所说,当您从不同来源获取 IP 时,这有效,其余代码将有效。

我猜你正在阅读一个 HTML 页面并希望在某处看到这个字符串:

var info_get_wanip="xxx.xxx.xxx.xxx";

但是,您需要确认 $routeraddress 是否真的得到了它,它看起来像

my $routeraddress = `addr admin:Tavolzhansky@192.168.1.1/RST_conn_status.htm`;

本质上只是对页面发出获取请求,但没有返回“var info_get_wanip="xxx.xxx.xxx.xxx";”。如果你对变量 $routeraddress 的赋值进行排序,那么它会起作用。

我不能说是怎么回事,因为我不知道它现在返回的是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多