나는 물었다이 문제LOG 파일 필터링 정보
로그 파일은 다음과 같습니다.
Jan 26 01:05:47 server54 kernel: [41s58.6w4335] INPUT:DROP: IN=eth4 OUT= MAC=d3:ss:43:23:23:43 SRC=1.1.1.1 DST=127.0.0.0 LEN=40 TOS=0x00 PREC=0x00 TTL=254 ID=65259 PROTO=TCP SPT=53252 DPT=22 WINDOW=14600 RES=0x00 RST URGP=0
명령은 다음과 같습니다:
tail -f -n 2 /var/log/kern.log | grep 'INPUT' \
| sed -E 's/^([0-9a-zA-Z: ]*[0-9]{2}:[0-9]{2}:[0-9]{2}).* \
(SRC=[0-9.:]+).*(DST=[0-9.:]+).*$/\1 \2 \3/g'
출력은 다음과 같습니다
Jan 26 01:05:47 SRC=1.1.1.1 DST=127.0.0.0
이제 소스 IP 주소(SRC=)의 국가(이름 또는 코드)를 가져오는 명령에 결과를 제공해야 하며 whois
결과는 다음과 같습니다.
Jan 26 01:05:47 SRC=1.1.1.1(US) DST=127.0.0.0(GH)
이 command() 또는 bash 스크립트에 양방향으로 이동하는 기능이 있는지 알고 싶습니다 tail
. 즉, 필터링된 로그를 인쇄한 후 다른 sed를 통해 소스 IP 주소를 가져오고 SRC=를 제거합니다.
sed -E 's/^.*(SRC=[0-9.:]+).*$/\1/g'| \
sed -e 's/SRC=//g' | whois ?!!!
그런 다음 이를 whois
명령에 입력하고 반환하여 인쇄 결과에 추가합니다.
아니면 각 파이프라인 이후 이전 결과가 사라지기 때문에 다른 접근 방식을 취해야 합니다.
답변1
글쎄, 쉘, awk 등을 사용하여 이러한 작업을 수행하는 것이 가능하지만 로컬 MaxMind 데이터베이스를 사용하면 더 좋고 예측 가능한 성능을 얻을 수 있습니다. Perl이나 Python과 같은 다른 언어를 사용하면 예를 들어 Python을 사용하여 더 읽기 쉬운 코드를 얻을 수 있습니다.
import re
import fileinput
import geoip2.database
reader = geoip2.database.Reader('GeoLite2-City.mmdb')
for line in fileinput.input():
# Extract source ip using Regexp
src_ip_search = re.search("SRC=(\S+)", line)
if src_ip_search is None:
continue # Didn't find SRC record for some reason
src_ip = src_ip_search.group(1)
# Get ISO name of country for that ip from mmdb
src_iso_code = reader.city(src_ip).country.iso_code
print(re.sub("SRC=(\S+)", "SRC=\g<1>({})".format(src_iso_code), line)
답변2
예를 들어 다음 스크립트를 사용하여 이를 수행할 수 있습니다.
out=$(awk '/INPUT/ {print $1,$2,$3,$11,$12}' /var/log/kern.log)
sourcec=$(whois $(echo $out|awk -F'[ =]' '{print $5}')|awk '/Country:/ {print $2}')
targetc=$(whois $(echo $out|awk -F'[ =]' '{print $7}')|awk '/Country:/ {print $2}')