tail -f의 출력을 스크립트에 전달

tail -f의 출력을 스크립트에 전달

tail -f /var/log/mail.log를 실행하면 파일에 새 줄이 추가될 때 거기에 앉아서 (-f) mail.log를 따릅니다. 불행하게도 초기 호출로 인해 마지막 10줄이 인쇄된 다음 파일이 변경될 때 계속 추가됩니다. 처음에는 마지막 행을 원했고 다음 행을 추가하면서 한 행씩 추가했습니다. 어떻게 해야 하나요?

이 작업이 완료되면 tail -f로 생성된 각 줄을 가져와 해당 내용을 처리하여 "다른 작업"을 수행하는 Bash 쉘 스크립트로 출력을 어떻게 리디렉션합니까?

현재 나의 "다른 것"은

echo "Finding instances from blockstr.txt"

BLOCKDB=/home/pi/blockstr.txt
IPS=$(grep -Ev "^#" $BLOCKDB)
for i in $IPS
do
   grep $i /var/log/mail.log | grep -v opendkim | grep -E -o '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -v '^0' >> block.lst
done
#cat censys.txt >> block.lst
#cat imeas.txt >> block.lst
#cat intcens.txt >> block.lst
#cat iran.txt >> block.lst
iptables -S  | grep DROP | sed 's/^.\{12\}//' | sed 's/.\{11\}$//' > iptab.lst
sort -u block.lst > block.srt
sort -u iptab.lst > iptab.srt
comm -23 block.srt iptab.srt > diff.srt

echo "Blocking IP addresses..."
BLOCKDB=/home/pi/diff.srt
IPS=$(grep -Ev "^#" $BLOCKDB)
for i in $IPS
do
    echo "Adding " $i
    iptables -A INPUT -s $i -j DROP 
done
echo "done."

rm block.lst block.srt iptab.lst iptab.srt diff.srt

형식이 올바르지 않으면 사과드립니다. 하지만 blockstr.txt의 각 문자열에 대해 mail.log를 한 줄씩 스캔하여 인스턴스를 찾고 IP 주소를 추출한 다음 IPTables에 추가하여 악당을 막습니다.

내가 바라던 대로 작동하지만, 백그라운드에서 계속해서 이 작업을 수행하도록 하는 것이 좋을 것입니다. tail -f로 깨우고 새 줄을 입력하는 것이 cron 작업에 넣고 1초에 60번 로그인을 시도하는 바보를 잡기 위해 1초마다 mail.log를 망치는 것보다 더 나은 방법인 것 같습니다. .

도움을 주셔서 감사합니다.

더 혼란스럽게 하기 위해 프로토타입은 제가 했던 파이프라인과 비슷할 것이라고 추측합니다.

tail -f (한 줄만) /var/log/mail.log ./blockstrings.sh

답변1

tail기본적으로 파일의 마지막 10줄이 출력되지만 -n이를 변경할 수 있는 옵션이 있습니다. 파일에 있는 것보다 더 많은 줄을 요청하는 것은 오류가 아닙니다.

-n옵션은 정수의 라인을 사용합니다. 부호가 없거나 음수 값은 파일 끝에서부터 거꾸로 계산됩니다. 명시적인 양수 값은 파일 시작 부분부터 계산되며 첫 번째 줄 번호는 입니다 +1. (예를 들어 헤더 행을 건너뛰는 데 유용합니다.)

따라서 tail -n 0 -f myFile원본 파일에 추가된 내용만 표시되며 해당 내용에 대한 기다림은 계속됩니다. 매초마다 추가 내용을 확인합니다. (이 설정을 변경하도록 선택할 수도 있습니다.)

전체 원본 파일을 표시하고 추가 사항을 기다리려면 다음을 사용하십시오.

tail -n +1 -f myFile

의 일부 버전에서는 또는 tail와 같은 숫자 옵션을 직접 허용하지만 이는 POSIX가 아닙니다.tail -5tail +5

tail파이프의 출력은 라인 버퍼링됩니다. 그러나 해당 파이프에서 읽은 내용은 자체 출력을 플러시하지 않을 수 있으므로 이러한 결과의 출력이 지연될 수 있습니다.

관련 정보