perl等于字符串比较即使它们相等也返回false

0 perl

我有这个脚本,其目标是比较/ var/adm/messages并检查当前最后一行是否与已检查的最新行相等.问题是即使字符串相同仍然脚本将它们视为不相等并继续if语句.这是脚本:

#!/usr/bin/perl

use strict;
use warnings;

open (MESSAGES, "tail -1 /var/adm/messages |" ) || die "failed to open alarms file \n$!\n\a";
open (ERRORLOG, ">>/usr/local/bin/mcdl_errors.log") || die "failed to open errorlog file \n$!\n\a";

my $last_line = `cat /usr/local/bin/line.txt`;


while (my $this_line = <MESSAGES>) {

  chomp($this_line);

  if ($this_line =~ m/inet|hyena|root/i) {

    if ($this_line ne $last_line) {

      print "$this_line\n";
      print "$last_line\n";    
      `echo $this_line > /usr/local/bin/line.txt`;

    }    
  }
} 

close (MESSAGES);
close (ERRORLOG);
Run Code Online (Sandbox Code Playgroud)

小智 6

问题1:您需要选择$ last_line(echo将添加一个\n),就像有人已经指出的那样.

问题2:在命令行上传递一个不带引号的字符串将导致shell解析它,这可能会丢失由shell解释的字符(多个空格或制表符缩小为一个空格,引号被删除等).发生这种情况时,您下次读取的last_line将不再与日志中的行匹配.

问题3:将不受信任的字符串传递给shell是一个非常糟糕的主意,因为攻击者很容易注入额外的命令来进入字符串,从而获得未经授权的访问.将日志字符串传递给未转义的shell是非常危险的.

总而言之,使用perl文件操作而不是shell编写line.txt会好得多.

  • @ user2131714:考虑让Perl打开文件,将字符串写入文件,关闭文件.它不会比启动shell运行echo慢(因为它最终会运行shell以及打开文件,写入文件并关闭文件). (2认同)