awkにログファイルと一致する条件があることを確認してください。

awkにログファイルと一致する条件があることを確認してください。

auth.logファイルで許可されているsshd接続を確認し、見つかった場合は対処します。

これは私のコードです。

tail -f /var/log/auth.log | awk '{ if($0 ~ /sshd/ && $0 ~ /Accepted/) { system("echo FOUND") } }'

何らかの理由で、これは出力を生成しません。誰かが理由を説明できますか?

答え1

あなたの問題はバッファリングに関連していると思いますtail -f

~$ tail auth.log | awk '{ if($0 ~ /sshd/ && $0 ~ /Accepted/) { system("echo FOUND") } }'
FOUND
FOUND

動作しますtailが、次のように失敗しますtail -f

~$ tail -f auth.log | awk '{ if($0 ~ /sshd/ && $0 ~ /Accepted/) { system("echo FOUND") } }'
^C

利用可能な回避策は、whileループを使用して各行を読み取ることですtail -f

~$ tail -f auth.log | while read line
> do
>     echo $line | awk '{ if($0 ~ /sshd/ && $0 ~ /Accepted/) { system("echo FOUND")} }'
> done
FOUND
FOUND

-

検索して次のオプションを見つけましたman awk(しかしこれはバージョンです...)。buffer-Wmawk

-W interactive

    バッファされていない書き込みを stdout に設定し、ラインバッファの読み出しを stdin に設定します。 stdinのレコードは値に関係なく減少しますRS

返品:

mawk-W i""や " -Wi"などのオプションの略語を受け入れます...

~$ tail -f auth.log | awk  -Wi  '/sshd/ && /Accepted/ {system("echo FOUND")}'
FOUND
FOUND

答え2

awk 呼び出しを使用してfflush()出力を更新することもできます。

tail -f /var/log/auth.log | 
    awk '{ if($0 ~ /sshd/ && $0 ~ /Accepted/) { fflush(); system("echo FOUND") } }'

つまり、awk複雑さのレベルは不要です。必要なものは次のとおりです。

tail -f /var/log/auth.log | awk '/sshd/ && /Accepted/{ fflush(); print "FOUND"}'

関連情報