tail 명령 결과에서 국가 코드/이름을 얻는 방법은 무엇입니까?

tail 명령 결과에서 국가 코드/이름을 얻는 방법은 무엇입니까?

나는 물었다이 문제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}')

관련 정보