如何使用Perl获取网关IP?

时间:2019-04-07 18:35:10

标签: perl

我需要知道本地主机的网关

我尝试使用系统命令和IP路由表,但是什么也没有。

 system("ipconfig | findstr /i "Gateway"")

除了输出是网关,我得到了Bareword found where operator expected at script.pl line 63, near ""ipconfig | findstr /i "Gateway" (Missing operator before Gateway?) String found where operator expected at script.pl line 63, near "Gateway""" syntax error at script.pl line 63, near ""ipconfig | findstr /i "Gateway" Execution of script.pl aborted due to compilation errors.

2 个答案:

答案 0 :(得分:4)

简介

findstring是没有用的,因为是一个出色的grep引擎...

在Linux下,我会这样做:

my $gw;
open my $ipr,"ip r|";
while (<$ipr>) {
    $gw=$1 if /default.*via ([0-9.]+) /;
};
print $gw."\n";

您的问题代表ipconfig,我认为类似

open my $ipr,"ipconfig /all|";
while (<$ipr>) {
    $gw=$1 if /[dD].*faul?t.*: ([0-9.]+) *$/;
};
print $gw."\n";

注意:正则表达式是基于fr.wikipedia和en.wikipedia的 try 欢迎反馈!

分组

my $gw;

my $regex='default.*via ([0-9.]+) ';
my $cmd='ip r';

if ($^O =~ "MSWin") {
    $regex='[dD].*faul?t.*: ([0-9.]+) *$';
    $cmd='ipconfig /all'
};

open my $ipr,$cmd."|";
while (<$ipr>) {
    $gw=$1 if /$regex/;
};

print $gw."\n";

这项工作在我的Debian Linux下进行。不知道这是否可以在MSWin下工作... 欢迎反馈!

或使用traceroute

use Net::Traceroute;
$tr = Net::Traceroute->new(host => "8.8.8.8",max_ttl=>1);
print "Gateway: " . $tr->hop_query_host(1,0) . "\n";

答案 1 :(得分:0)

我看到没有人真正解释过您的问题。

不能在双引号字符串中使用普通的双引号字符。如果您考虑一下,很明显,双引号字符串中的第一个双引号字符将被视为字符串的结尾。

您的代码是这样的:

 system("ipconfig | findstr /i "Gateway"")

这被视为双引号字符串("ipconfig | findstr /i"),后跟一个裸字(Gateway)和另一个双引号字符串(空字符串-"")。这永远不会成功编译。

最简单的解决方法是将双引号字符串更改为单引号字符串:

 system('ipconfig | findstr /i "Gateway"')

但是,正如其他人指出的那样,当您拥有全部Perl功能时,使用findstr似乎是一个很奇怪的想法。