我有这个脚本,其目标是比较/ 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);
答案 0 :(得分:6)
问题1:您需要选择$ last_line(echo将添加一个\ n),就像有人已经指出的那样。
问题2:在命令行上传递一个不带引号的字符串将导致shell解析它,这可能会丢失由shell解释的字符(多个空格或制表符缩小为一个空格,引号被删除等)。发生这种情况时,您下次读取的last_line将不再与日志中的行匹配。
问题3:将不受信任的字符串传递给shell是一个非常糟糕的主意,因为攻击者很容易注入额外的命令来进入字符串,从而获得未经授权的访问。将日志字符串传递给未转义的shell是非常危险的。
总而言之,使用perl文件操作而不是shell来编写line.txt会好得多。