次のファイルがあります:
6 192.168.0.4
13 192.168.0.2
2 192.168.0.9
最初の数字は、右側のIPが同じネットワーク内から私のマシン(ssh)にログインしようとした回数です。目標は、試行が3回を超える場合、netfilterを使用してそのIPをブロックすることです。ここでは、2つのエントリが基準に一致します。注:3つ以上のエントリーがある場合があります。
このファイルを1行ごとに並べ替える方法がわかりません(私はBASHが初めてです)。ここに私が試したものがあります:
#!/bin/bash
file="/home/foo/documents/iptxt"
while IFS='' read line || [[ -n "$line" ]]; do
char1=`awk '{ print $1 }' $file`
char2=`awk '{ print $2 }' $file`
if $char1 -gt 3
then
echo "$char2 has tried to login $char1 times
fi
done <$file
これにより、5行目(ifステートメント)を指す「コマンドが見つかりません」エラーが発生します。当然、$ char1_attemptをエコーし、次の結果が得られます。
6 13 2
6 13 2
6 13 2
とりあえず、Jは次のような行を出力したいだけです。
192.168.0.4 has tried to login 6 times
192.168.0.2 has tried to login 13 times
192.168.0.1 has tried to login 2 times
助けてください!
このように始めることをお勧めします:
#!/bin/bash
file="/home/foo/documents/iptxt"
while read num addr ; do
if [[ "$num" && "$addr" ]] ; then
echo "$addr has tried to log in $num times"
fi
done < "$file"
この方法で、read
は各行の最初のワードを$num
に、残りの行を$addr
に格納します。これはIPアドレスのみである必要があります。次に、whileループ内で、両方が空でないかどうかを確認し、空でない場合はメッセージを出力します。