Как получить IP шлюза с Perl? - PullRequest
0 голосов
/ 07 апреля 2019

Мне нужно знать шлюз локального хоста

Я пытался использовать системную команду и таблицу маршрутизации 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 ]

4 голосов
/ 07 апреля 2019

Intro

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";

Примечание: Regex - это try , основанное на fr.wikipedia и en.wikipedia. Обратная связь приветствуется!

Группировка

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";
0 голосов
/ 08 апреля 2019

Я вижу, никто на самом деле не объяснил, в чем ваша проблема.

Вы не можете использовать простые двойные кавычки внутри строки в двойных кавычках.Если вы подумаете об этом, должно быть очевидно, что первый символ двойной кавычки внутри строки в двойных кавычках будет рассматриваться как конец строки.

Ваш код выглядит так:

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

Это рассматривается как строка в двойных кавычках ("ipconfig | findstr /i"), за которой следует голое слово (Gateway) и еще одна строка в двойных кавычках (пустая строка - "").Это никогда не будет успешно скомпилировано.

Самое простое решение - заменить строку в двойных кавычках на строку в одинарных кавычках:

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

Но, как отмечали другие, этокажется очень странной идеей использовать findstr, когда у вас есть вся мощь Perl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...