이 스크립트에 대한 도움이 필요합니다. 이 스크립트는 filter.txt를 통해 apache_access.log를 분석합니다. 필터에 해당 용어가 있으면 스크립트가 작업을 수행합니다. 제 생각에 문제는 "for"라는 첫 번째 명령에 있는 것 같습니다. 필터를 한 줄씩 사용할 수 없습니다.
누군가 나를 도와줄 수 있나요?
for term in `tail -n $LINESTOSEARCH $IPEATERFILTER`
do
for ip in `tail -n $LINESTOSEARCH $LOGFILE | grep "$TERM" | awk "{print \\$1}" | sort | uniq -c | sort -rn | head -20 | awk "{if (\\$1 > $THRESHOLD) print \\$2}"`
do
# Look in iptables to see if this IP is already banned
if ! iptables -L INPUT -n | grep -q $ip
then
# Do something
fi
done
done
답변1
너다음 줄을 읽고 싶지 않습니다.for
. 대신 while
및를 사용하세요 read
. 문제는 쉘이 공백으로 인수를 분할하므로 로그 파일 줄의 공백으로 인해 실제로 루프가 다른 시간에 실행된다는 것입니다.
tail -n $LINESTOSEARCH $IPEATERFILTER | while read -r line; do
# do something with "$line"
done
내부 루프에 대해 동일한 패턴을 반복합니다.