저는 bash 스크립팅을 배우기 시작했고 다음 스크립트로 시작하고 싶었습니다. 아이디어는 auth.log에서 실패한 SSH 로그인을 검색한 다음 알림 보내기를 통해 경고를 보내는 것입니다. 내가 원하는 것은 단지 실패가 아닌 여러 로그 항목을 찾는 것입니다. 그러나 이 스크립트는 Failed를 찾기 때문에 이후의 모든 항목에는 Failed가 포함되어야 합니다.
같은 부분을 마지막부터 다시 반복해 보았는데, 당연히 스크립트가 실행되지 않더군요. 나는 이것에 익숙하지 않기 때문에 어디서 대답을 찾기 시작해야할지 모르겠습니다. 나는 누구에게도 이 문제를 해결하라고 요구하지 않습니다. 더 중요한 것은 이 문제를 해결하려면 X를 사용해야 한다는 것입니다.
내 목표는 auth.log에서 여러 항목을 스캔한 다음 해당 항목에 고유한 행을 갖도록 하는 것입니다. 또한 auth.log뿐만 아니라 여러 로그 파일을 스캔할 수 있기를 바랍니다. 누군가 내가 이것을 위해 무엇을 해야 하는지 지적할 수 있습니까? 감사해요.
#!/bin/bash
tail -fn0 /var/log/auth.log |
grep --line-buffered 'Failed' |
while read line
do
notify-send 'SSH Login Failed' "$line"
done
답변1
tail의 출력을 grep으로 파이프하는 대신 루프 내에서 정규식을 사용할 수 있습니까?
#!/bin/bash
tail -fn0 /var/log/auth.log |
while read line
do
if [[ "${line}" =~ "Failed password" ]]; then
notify-send 'SSH Login Failed' "$line"
continue
fi
if [[ "${line}" =~ "different condition" ]]; then
notify-send 'This condition happened' "$line"
continue
fi
done
SSH 실패의 경우 대부분의 *Ix 시스템은 연결을 닫기 전에 3번의 시도를 허용합니다. 이로 인해 시도가 실패할 때마다 3개의 이메일이 전송될 수 있습니다.
여러 파일을 모니터링하는 방법의 예로 이 초안을 빠르게 작성했습니다.
#!/bin/bash
# vi: set ts=4 sw=4 noai ic showmode showmatch:
monitor_log () {
tail -fn0 $1 |
while read line
do
if [[ "${line}" =~ "Failed password" ]]; then
notify-send 'SSH Login Failed' "$line"
continue
fi
if [[ "${line}" =~ "different condition" ]]; then
notify-send 'This condition happened' "$line"
continue
fi
done
} # end monitor_log
### Main Script ###
for file in /var/log/auth.log /var/log/syslog
do
monitor_log "${file}" &
done