web-dev-qa-db-ja.com

else出力にsyslogを使用する方法(whois-queryで表示)?

ログファイル_/var/log/syslog_があり、たとえば_SRC=10.158.0.1_。

このファイルから_SRC= ..._のすべての印刷されたアドレスをスキャンし、whois (SRC= ...)を使用してクエリを作成します。

このクエリは監視する必要があります。

私の試みは間違っており、bashスクリプトでは次のようになります。

_#/bin/bash

while [ 1 ]
do
    grep ‘SRC=ip-address’ /var/log/syslog >> /home/$user/topsecret001/pitbull001.txt;
    whois ‘SRC=ip-address’ >> /home/$user/topsecret001/pitbull002.txt;
done
_

誰かがトリックを手伝うことができますか? ip-addressを定義する方法と、このip-addressでwhoisコマンドを使用するにはどうすればよいですか?

/ var/log/syslogの出力は、次のスニペットのようになります。

http://paste.ubuntu.com/5859332/

/ var/log/syslogの出力は次のようになります-アラートが少しある場合(今日のような):

http://paste.ubuntu.com/5862958/

アイデアもそうです-スクロールするsyslogの行に「無効な状態」が表示されている場合にのみwhois-queryを実行します。


ご協力ありがとうございます。私はあなたのコードから何かを学びました。多くの場合、ソリューションはここのように考えるよりも簡単に見えます-私はそれがより困難になると思ったので。最近のenzotibの貢献で、この問題はすでに解決されていると思います。


16.04を参照した今日(2016年6月22日)の新しいコメントを参照してください。

このbashスクリプトはipv4の時間用だったため、ipv4を有効にするには/etc/sysctl.confのコメントを外す必要がありますか? -このスクリプトは実行されますか?それ以外の場合、以前のようなwhois-outputはありません。 /etc/sysctl.confの28行目と33行目のコメントを外してこれを確認しました。このスレッドのこのbashスクリプトは機能しますが、プロバイダーがファイアウォールを有効にしているため(no-spy-act?このように2016年6月22日の追加により、このスレッドは16.04で実現されます

7
dschinn1001

さらに別のソリューション:

awk '{ 
      for (i = 1; i <= NF; i++) 
        if ($i ~ /^SRC=/) 
          print substr($i, 5) 
    }' /var/log/syslog |
  sort -u |
  while read ip; do
    printf ' === %s ===\n' "$ip"
    whois "$ip"
  done

文字列INVALID STATEを含むsyslogの行のみを選択する場合、上記のコードは次のように変更できます。

awk '/INVALID STATE/ { 
      for (i = 1; i <= NF; i++) 
        if ($i ~ /^SRC=/) 
          print substr($i, 5) 
    }' /var/log/syslog |
  sort -u |
  while read ip; do
    printf ' === %s ===\n' "$ip"
    whois "$ip"
  done
8
enzotib

sedコマンドを使用して、ファイルからIPアドレスをすべて抽出し、xargsを使用して、一致するたびにwhoisを実行できます。

_sed 's/^.*SRC=\([0-9.]*\).*$/\1/;t;d' < /var/log/syslog | xargs -n1 whois >> output.txt
_

s/^.*SRC=\([0-9.]*\).*$/\1/コマンドは、SRC = x.x.x.xを含む行をIPアドレスのみに置き換えます。

't; d'コマンドは、一致しない行をスキップします(それにより、個別のgrepコマンドを回避します)。

xargsコマンドは、whoisが出力するアドレスごとにsedを1回呼び出します。


または、最初に一致する行を見つけてログに記録してから、IPアドレスを個別に抽出することもできます。

_grep -eSRC=[0-9.]* /var/log/syslog | tee grep-output.txt | sed 's/^.*SRC=\([0-9.]*\).*$/\1/' | xargs -n1 whois >> whois-output.txt`
_
5
cscarney

おそらく、次のコードが適切な出発点です。それはおそらく最適なソリューションではありませんが、その仕事をします。

これは、$()内のコマンドのすべての出力行に対するforループで構成されています。ループの各反復で、出力の1行が変数IPに保存されます。次に、ループ内で、引数として$ IP(変数IPの内容)を使用してwhoisコマンドが呼び出されます。

角括弧$()は2つのgrepコマンドを囲みます-最初のコマンドは、SRC =が前に書かれたIPアドレスを検索し、2番目のコマンドは最初の出力を(パイプ|を介して)取得し、IPアドレスのみを取得します。 grepの-oフラグを使用すると、行全体ではなく、一致した行部分のみが出力されます。

正規表現もまだあまりエレガントではありません。それぞれが1〜3桁とドットで構成され、その後に1〜3桁が続く3つのグループを検索しています。スクリプトを読みやすくするために、-E拡張正規表現を使用することにしました。 「通常の」grepコマンドでは、すべての丸括弧と中括弧の前にバックスラッシュが必要です...

for IP in \
 $(grep  -E "SRC=([0-9]{1,3}\.){3}[[0-9]{1,3}" -o  /var/log/syslog  | \
 grep -E "([0-9]{1,3}\.){3}[[0-9]{1,3}" -o);
    do whois $IP;
done
3
soulsource

スクリプトは次のようになります。

#/bin/bash

grep 'SRC=' /var/log/syslog | awk 'BEGIN {FS="[ \t]+|\\|"} {print $13}' | uniq >> ~/topsecret001/pitbull001.txt

for ip in $(sed -e 's/SRC=//g' ~/topsecret001/pitbull001.txt)
do 
    whois $ip >> ~/topsecret001/pitbull002.txt
done
2
Radu Rădeanu

オプションを追加するために-「無効な状態」をポップアップする場合-これは動作しますか? :

awk '{

    for (i = 1; i <= NF; i++)

      if ($i ~ /^SRC=/)

         print substr($i, 5)

   }' /var/log/syslog | sort -u | while read ip; 

do

   printf ' INVALID STATE ' && printf ' === %s ===\n' "$ip"

   whois "$ip"

 done
0
dschinn1001