【问题标题】:Ignore blank variable return from qx忽略来自 qx 的空白变量返回
【发布时间】:2013-01-14 01:50:32
【问题描述】:

我的一点点代码有困难。

open ("files","$list");
while (my $sort = <files>) {
  chomp $sort;
  foreach my $key (sort keys %ips) {
    if ($key =~ $sort) {
      print "key $key\n";
      my $match =qx(iptables -nL | grep $key 2>&1);
      print "Match Results $match\n";
      chomp $match;
      my $banned = $1 if $match =~ (/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/);
      print "Banned Results $banned\n";
      if ($key =~ $banned) {
        print "Already banned $banned\n";
      } else {
        system ("iptables -A INPUT -s $key -j DROP");
        open my $fh, '>>', 'banned.out';
        print "Match Found we need to block it $key\n";
        print $fh "$key:$timestamp\n";
        close $fh;
      }
    }
  }
}

所以基本上我正在做的是打开每行 1 个地址的列表。

接下来,我将从脚本的另一部分中对我的关键变量进行排序,并将其与我的列表进行匹配,如果匹配,则继续执行 if 语句。

现在使用匹配的密钥,我需要检查它是否已经被阻止,所以我使用 qx 来执行该变量的 iptables 和 grep。如果匹配,一切都会完美运行。

如果不匹配,换句话说,我的 iptables -nL | grep $key 返回一个空白值,而不是继续执行我的 else 语句,它会“抓取”该空白值用于 $match 并继续执行。

在我的一生中,我无法弄清楚如何去除那个空白值并基本上将其显示为没有回报。

我知道有用于 iptables 等的模块,但是我必须让这个脚本尽可能通用。

【问题讨论】:

    标签: regex perl iptables


    【解决方案1】:

    问题在于,当iptables 没有返回任何结果时,$banned 将保留其默认值undef。用作正则表达式,$banned 匹配每个字符串,所以你的条件:

    if ($key =~ $banned) {
    

    总是匹配。我想你的意思可能是

    if ($key eq $banned) {
    

    如果$bannedundef(因为$matched 为空或与正则表达式不匹配)或者如果您使用正则表达式提取的IP 地址与$key 有所不同,这将失败。

    如果您确信 iptables 结果中的第一个 IP 将与 $key 相同,那么您可以将条件简化为

    if ($match =~ /(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/) {
    

    【讨论】:

    • 成功了,只是简化了它并且有效。非常感谢!
    【解决方案2】:

    我建议您将来自iptables -nL 的整个输出放入一个数组中,然后使用 Perl 将grep 它。这样,您将只调用该实用程序一次,并且很容易检测到一个空列表。

    如果你写

    my @iptables = qx(iptables -nL);
    

    在您的代码顶部,然后您可以通过

    查询此输出
    my @match = grep /\b$key\b/, @iptables;
    

    如果没有包含 IP 地址的记录,则后续

    if (@match) { ... }
    

    会失败。

    您的代码还有一些其他问题。首先,您必须始终在程序开始时使用use strictuse warnings,并在第一个使用点声明所有变量。这将发现许多您可能很容易忽略的简单错误,尤其是在您寻求代码帮助时。

    您的open 电话应如下所示

    open my $fh, '<', $file or die $!;
    

    一起

    while (my $sort = <$fh>) { ... }
    

    而且您似乎错过了哈希的要点。无需通读散列中的所有键来寻找匹配项,因为可以使用$ips{$sort} 直接访问散列元素。如果返回值为undef,则该元素不存在,或者您可以使用if (exists $ips{$sort}) { ... } 显式检查其是否存在。

    我无法再提供帮助,因为我无法访问提供iptables 的平台。如果您需要更多帮助,请发布该实用程序的一些输出。

    【讨论】:

    • 感谢您的洞察力,我将重新编写我的代码以充分利用哈希,我绝不是一个伟大的程序员。只要知道足够危险:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    • 2022-10-01
    • 2017-03-13
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多