ログファイル_/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で実現されます
さらに別のソリューション:
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
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`
_
おそらく、次のコードが適切な出発点です。それはおそらく最適なソリューションではありませんが、その仕事をします。
これは、$()内のコマンドのすべての出力行に対する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
スクリプトは次のようになります。
#/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
オプションを追加するために-「無効な状態」をポップアップする場合-これは動作しますか? :
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