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
-W
mawk
-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"}'