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