コードの一部に問題があります。
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 $key
elseステートメントに移動する代わりに空白の値を返し、$ matchの空白の値を「取得」して、実行を継続します。
私の人生では、その空白の値を取り除き、基本的にそれをノーリターンとして表示する方法を理解できません。
iptablesなどのモジュールがあることは知っていますが、このスクリプトをできるだけ汎用的に保つ必要があります。