使用此代码,日志文件中的结果始终是总输出。
我也尝试在变量中传递正则表达式,但没有运气。
我们的想法是将命令的所有输出打印到日志文件中,直到它到达以known
开头的行。
请分享您的想法或您认为正确的方法。
use strict;
use warnings;
use Net::Telnet;
my $telnet = new Net::Telnet( Timeout => 10, Errmode => 'die' );
my $logfile = 'Rogues.log';
my @hosts;
my $debug = 1;
$hosts[0] = 'xxx.xxx.xxx.xxx';
$telnet->open( "$hosts[0]" ) or die $telnet->errmsg;
$telnet->waitfor( '/Please login: $/i' );
$telnet->print( 'USERHERE' ) or die $telnet->errmsg;
$telnet->waitfor( '/Password: $/i' );
$telnet->print( 'PASSWORDHERE' ) or die $telnet->errmsg;
$telnet->waitfor( '/XXXX>/' );
$telnet->cmd( 'enable' ) or die $telnet->errmsg;
my @output = $telnet->cmd( 'show rogue-devices' ) or die $telnet->errmsg;
$telnet->close();
foreach my $index ( @output ) {
if ( ( $index ne /^Known\/Recognized\sRogue\sDevices:/ )
|| ( $index ne /^User\sBlocked\sRogue\sDevices:/ ) ) {
if ( $debug ) { }
open( my $fh, '>>', 'ZD_Rogues.log' ) or die "Could not open file $logfile $!";
print $fh "\n $index";
close $fh;
}
}
print "Export Finished. $logfile";
嗨,输出由3组组成。 “当前活跃的流氓设备”后跟“已知/识别的恶意设备”,然后是“用户阻止的恶意设备:”,所有内容都相同:恶意设备:Mac地址= XXX频道= XXX广播= XXX类型= XXX加密= XXX SSID = XXX上次检测到= XXX
答案 0 :(得分:1)
你的问题很不清楚。你说
我们的想法是将命令的所有输出打印到日志文件中,直到它到达以已知
开头的行。
这有用吗?
for ( @output ) {
last if /^known/i;
print;
}
您正在使用字符串不等运算符ne
而不是模式绑定运算符!~
喜欢这样
if ( $index !~ /^Known\/Recognized\sRogue\sDevices:/
or $index !~ /^User\sBlocked\sRogue\sDevices:/ ) {
...
}
答案 1 :(得分:0)
如上所述,您想使用!=运算符。但是你也有错误的逻辑运算符 - 当你使用'和'(&&)时你正在使用'或'(||)。
答案 2 :(得分:0)
You can exit the loop using last when you reach one of your stop lines. Note that regexes match case-sensitively... if you want to be case-insensitive, add the i
flag to the end of your regex: /regex/i
.
for my $index (@output) {
last if $index =~ /^Known\/Recognized Rogue Devices/
|| $index =~ /^User Blocked Rogue Devices/;
print "$index\n";
}
答案 3 :(得分:0)
感谢@Borodin,@ stevieb,@ Ken Slater和@toolic,感谢您的反馈和时间。 如果我一开始也没有正确解释自己,我道歉。
for my $index (@output) {
open (my $fh, '>>', 'ZD_Rogues.log') or die "Could not open file $logfile $!";
last if $index =~ /Known/;
print $fh "\n $index";
close $fh;
}
上面的结果确实是,所有行都在导出到日志文件时停止,当它到达"已知"的行时。