2017-07-30 4 views
0

私は、ログファイル(var/log/auth)を解析することによって、各ipからのログイン試行を数える方法を探します。私はすでにこれを行う方法を見つけましたが、それは醜いですし、ファイル操作のために多くの時間が必要です。bashスクリプト内のログファイルからのログインに使用されるipのカウント方法は?

これは変数でのみ実行できませんでしたか?私が欲しいのはこれは私が欲しいいけないものです...カウント=

感謝

IPなどの一覧です:)ログファイルから

for ip in $(cat /var/log/auth.log | grep sshd | grep Failed | grep -v invalid | awk '{ print $11; }'); do 
     if [ -e "log/$ip" ]; then 
       file="log/$ip" 
       counter=$(cat "$file") 
       counter=$[$counter +1] 
       echo $counter > log/$ip 
     else 
       echo 1 >> log/$ip 
     fi 
done 

サンプルは

Jul 30 21:07:30 Server sshd[20895]: Failed password for root from 58.242.83.20 port 41448 ssh2 
Jul 30 21:07:31 Server sshd[20897]: Failed password for root from 61.177.172.44 port 28603 ssh2 
です

私が欲しいものは何かです。 58.242.83.20 = 1932 61.177.172.44 = 3

+0

「wc -l」はどうしますか? ;-) 'NB_IPS = $(cat /var/log/auth.log | grep sshd | grep失敗| grep -v無効| awk '(印刷$ 11;} | wc -l)' – Fabien

+0

サンプル入力とあなたの望みを追加してくださいあなたの質問にそのサンプル入力のための出力。 – Cyrus

+0

wc -lステートメントの問題は、異なるipsがあり、すべてのipsを抽出してログイン試行をカウントしたいということです。 –

答えて

0

これはsortuniqawkを使用してアイデアです:

awk '$5 ~ "sshd" && $6 = "Failed" && $9 != "invalid" { print $11 }' auth.log | sort | uniq -c 

それともawk

awk '$5 ~ "sshd" && $6 = "Failed" && $9 != "invalid" { ips[$11]++ } END { for (ip in ips) print ip"="ips[ip]}' auth.log 
+0

'&& $ 9!=" invalid "'を追加して、私のヨハネスブルナー。 – Cyrus

+0

@Cyrusありがとう!私は逃しました。私はあなたの提案で答えを更新しました。 – archemiro

0
grep -Po 'sshd.*Failed password for [^i]* \K[0-9.]{7,14}' file | sort | uniq -c 
私のために完璧な作品

...サイラス

+0

ユーザー名が「i」で始まる場合は機能しないため、私はあなたの質問にコメントを削除しました。私は彼の答えに私のコメントとarchimiroの答えを使用することをお勧めします。 – Cyrus

0

試しに 感謝awkを使ったもう1つのアプローチ、ここではwhで同じ順序で出力しますあなたのInput_fileにIPが来ました。

awk '!/invalid/ && /Server sshd.*Failed password/{ 
     match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/); 
     val=substr($0,RSTART,RLENGTH); 
     if(!a[val]){ 
      b[++i]=val 
     }; 
     a[val]++ 
     } 
    END{ 
     for(j=1;j<=i;j++){ 
      print b[j],a[b[j]] 
     } 
    }' Input_file 
関連する問題