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