0

コードの一部に問題があります。

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行に1つずつアドレスのリストを開くことです。

次に、スクリプトの別のセクションからキー変数を並べ替えて、リストと照合します。一致する場合は、ifステートメントに進みます。

一致したキーを使用して、そのキーがすでにブロックされているかどうかを確認する必要があるため、qxを使用してその変数のiptablesとgrepを実行しています。それが一致する場合、すべてが完全に機能します。

一致しない場合、つまり、iptables -nL | grep $keyelseステートメントに移動する代わりに空白の値を返し、$ matchの空白の値を「取得」して、実行を継続します。

私の人生では、その空白の値を取り除き、基本的にそれをノーリターンとして表示する方法を理解できません。

iptablesなどのモジュールがあることは知っていますが、このスクリプトをできるだけ汎用的に保つ必要があります。

4

2 に答える 2

2

問題は、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})/) {
于 2013-01-13T17:50:32.643 に答える
2

からの出力全体をiptables -nL配列に入れ、 grepPerl を使用することをお勧めします。そうすれば、ユーティリティを一度だけ呼び出すことができ、空のリストを簡単に検出できます。

あなたが書くなら

my @iptables = qx(iptables -nL);

コードの上部にある場合、この出力を次のようにクエリできます

my @match = grep /\b$key\b/, @iptables;

IP アドレスを含むレコードがない場合は、後続の

if (@match) { ... }

失敗します。

コードには他にもいくつかの問題があります。まず、常に use strictプログラムのuse warnings開始時に、すべての変数を最初に使用する時点で宣言する必要があります。これにより、他の方法では簡単に見落としてしまう多くの単純なエラーが明らかになり、特にコードについて助けを求めている場合に当てはまります。

あなたのopen呼び出しは次のようになります

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

一緒に

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

そして、あなたはハッシュのポイントを逃したようです。ハッシュ要素は で直接アクセスできるため、一致を探すためにハッシュ内のすべてのキーを読み取る必要はありません$ips{$sort}。返された値が である場合、undefその要素は存在しないか、 でその存在を明示的に確認できますif (exists $ips{$sort}) { ... }

を提供するプラットフォームにアクセスできないため、これ以上お手伝いできませんiptables。さらにヘルプが必要な場合は、ユーティリティからの出力を投稿してください。

于 2013-01-13T17:49:13.727 に答える