-1

私はこれを機能させようとしていますが、出力はありません。ここでやろうとしているのは、複数の名前を持つtxtファイルからgrepになり、ユーザー名に一致するIPアドレスをエクスポートすることです。各行が読み取られ、BadIP.out にエクスポートされるたびにループし続けます。

#!/bin/sh

    cat /Badusers.txt

    while IFS= read -r LINE
    do
    grep '"$LINE"' /var/log/test.log 
    awk -F" " '{print $8}' 
    grep -o '^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' > /badIP.out

    done </badIP.out

アップデート:

この時点で問題があるところだけを投稿したので、ゼロから始めましょう。

2 つの同じプログラムを実行しているサーバーがあります。1 つのデバイスから接続するために、プログラムごとに 2 つの接続をクライアントに与えています。最近、それらを別々に使用しているものがあることに気付いたので、ログから何かを発明しなければなりませんでした。

プログラムは、IP、ユーザー名、NODEID などのデータをログに記録します。nodeID から、ユーザーが不正行為を行っているかどうかを確認できます。各プログラムのログを比較し、一致する抽出データを一致させたい。一致する場合はすべて問題ないことを意味し、NodeID が失敗した場合は不正行為を意味します。だから私がしたことはこれです

1) ユーザーの NodeID を照合することにより、プログラムの両方のログを取得しました 2) 次に、そのログから別のログにエクスポートします3) ユーザー名を NodeID から分離します (txt ファイルにエクスポートします) 4) スクリプトを使用して、ループを使用して TXT ファイルを読み取り、ユーザー名に一致する IP アドレスをログにフェッチして、BadIP.out にエクスポートします 5 ) 次に、ループ読み取り BADIP.out を使用して、IPtables を使用してユーザー IP を禁止します

これらのファイルを作成しました。PS私は開発者ではありません:)

これは私が実行するプログラムです

#!/bin/bash
./cam.sh
./cam2.sh
diff -i -b -B -q cam.txt cam2.txt
if [ ! $? -eq 0 ]; then
echo "**** File has changed*****" 
diff <(sort /cam.txt) <(sort /cam2.txt)|awk '/^</{print $5>"temp1.out"}/^>/{print $5>"temp2.out"}'
#awk -F "@" 'BEGIN{while(getline<"temp1.out") a [$1]=1 } ; a[$1] !=2 {print $1}' temp2.out 
awk -F'@' 'BEGIN{while(getline<"cam.txt") a[$2,$3]=1};a[$2,$3]!=1' cam2.txt >> /notify.txt
#diff -i -b -B -y temp1.out temp2.out >> /diff.txt
grep 'client' /notify.txt | awk -F" " '{print $4}' | cut -d@ -f1 >> /Badusers.txt
grep 'client' /notify.txt | awk -F" " '{print $4}' | cut -d@ -f2 | awk -F "," '{print $1}' >> /Badnodeid.txt
./mail.sh
#rm *.txt
#rm *.out
else
echo "same"
fi

これは program1 から log1 まで読み取ります

cam.sh

#!/bin/bash

for filename in /var/log/test.log; do
 if [ "$(grep "xyz" $filename)" ]; then
awk '/xyz/ && $8 == version' $filename >> /cam.txt
 else
   echo "$time Boo!! Failure.."
 fi
done

これは、program2 から log2 に読み取ります

cam2.sh

#!/bin/bash

for filename in /var/log/test2.log; do
 if [ "$(grep "xyz" $filename)" ]; then
awk '/xyz/ && $8 == version' $filename >> /cam2.txt
 else
   echo "$time Boo!! Failure.."
 fi
done

これは、ユーザーと一緒にメールを送信するためのものです

メール.sh

#!/bin/bash
mutt -s "Test mail" -a /notify.txt *****@gmail.com < /notify.txt

ログのサンプル

cam.txt & cam2.txt

03:00:08.818 Prg: client xyz661s@e15279f57cc56c7f, running Prg 2.1.4
03:00:08.942 Prg: client xyz886s@1c8f2a6efe3963d7, running Prg 2.2.1
03:00:09.576 Prg: client xyz502s@165e25ac273d4751, running Prg 2.1.4
03:00:10.235 Prg: client xyz852s@6a16130252dea90a, running Prg 2.1.4
03:00:11.677 Prg: client xyz808s@ed52ddf03f1e7111, running Prg 2.1.3
03:00:11.685 Prg: client xyz034s@63007fd8e9591501, running Prg 2.1.4
03:00:11.687 Prg: client xyz885s@84ac60cf204e94a2, running Prg 2.2.1
03:00:11.796 Prg: client xyz687s@f6492af984a26f37, running Prg 2.1.4
03:00:11.818 Prg: client xyz584s@6b70bcc9670dd4f4, running Prg 2.1.1
03:00:11.891 Prg: client xyz544s@5c3284516ab8e072, running Prg 2.2.1
03:00:11.895 Prg: client xyz529s@f9c0fc6756d62f4f, running Prg 2.1.4
03:00:11.912 Prg: client xyz509s@dfb6da96a35a3022, running Prg 2.1.4
03:00:11.915 Prg: client xyz581s@6d7512ee647d3441, running Prg 2.1.2

badusers.txt

xyz712s
xyz553s
xyz500s
xyz676s
xyz553s
xyz712s
xyz697s

badnodeid.txt

403a8a9fe084b6cb
d6fe8f201e4d854e
5a7321d7b49cef9b
6da486276fafe5f5
d6fe8f201e4d854e

通知.txt

03:00:11.715 Prg: client xyz712s@403a8a9fe084b6cb, running Prg 2.1.3
03:00:13.674 Prg: client xyz553s@d6fe8f201e4d854e, running Prg 2.2.1
03:00:16.260 Prg: client xyz500s@5a7321d7b49cef9b, running Prg 2.1.4
10:02:42.961 Prg: client xyz676s@6da486276fafe5f5, running Prg 2.2.1
10:53:55.374 Prg: client xyz553s@d6fe8f201e4d854e, running Prg 2.2.1
12:36:32.885 Prg: client xyz712s@403a8a9fe084b6cb, running Prg 2.1.3
12:36:54.283 Prg: client xyz697s@51724d66fec8da4c, running Prg 2.1.4
12:37:21.052 Prg: client xyz712s@403a8a9fe084b6cb, running Prg 2.1.3

temp1.out

xyz661s@e15279f57cc56c7f,
xyz886s@1c8f2a6efe3963d7,
xyz502s@165e25ac273d4751,
xyz852s@6a16130252dea90a,
xyz808s@ed52ddf03f1e7111,
xyz034s@63007fd8e9591501,

temp2.​​out

xyz661s@e15279f57cc56c7f,
xyz886s@1c8f2a6efe3963d7,
xyz502s@165e25ac273d4751,
xyz852s@6a16130252dea90a,
xyz021s@1ad450e34bc26dc7,
xyz712s@403a8a9fe084b6cb,
xyz544s@5c3284516ab8e072,

残っているのは、上記のスクリプトの while ループを作成して、test.log からユーザーを取得し、IP を見つけて、それらを BadIP.out にエクスポートすることです。BAN するには、このようなものが必要です。

$logdir/badIP.out > $logdir/badIP.block
while IFS= read -r EachLine
do
command="iptables -A INPUT -s "$EachLine" -j DROP"
echo $command
$command
done < $logdir/badIP.block
rm $logdir/badIP.block
if [ -s $logdir/illegaluser.txt ] ; then
iptables-save -c > $logdir/iptables-save.new
4

2 に答える 2

0

次のいずれかを使用する必要があるようです。

fgrep -f /badIP.out /var/log/test.log

grep -F -f /badIP.out /var/log/test.log

/badIP.out ファイルが非常に大きい場合を除き、これはかなり効果的に機能します。単一の「不正な IP」のデータがすべて出力にまとめられるように出力を並べ替えたいと思うかもしれませんが、それを確実に行うには、ファイル形式の知識が必要です。

于 2011-03-09T06:06:53.643 に答える
0

/badIP.out から読み取っていて、while 読み取りループ内で、2 番目の grep コマンドにファイル入力がありません。また、なぜ badIP.out にリダイレクトするのですか? 別のファイル名を使用してください。

于 2011-03-09T04:43:22.487 に答える