Bash: IP 주소와 이름이 일치하는 추가 열을 인쇄하는 방법

Bash: IP 주소와 이름이 일치하는 추가 열을 인쇄하는 방법

netstat연결된 IP에 대한 정보를 수집 하는데 사용합니다 . 나는 다음과 같은 형식을 가지고 있습니다 :

netstat -tn 2>/dev/null | awk '/:80 / {print $5}' | sed 's/.*::ffff://' | sed 's/:.*//' | sor t | uniq -c | sort -nr
      5 81.133.113.200
      4 80.229.142.126
      2 94.136.36.29
      2 92.19.231.69
      2 85.159.56.230
      2 83.70.246.152
      2 81.131.118.236
      2 185.106.92.42
      1 92.19.232.88
      1 86.47.113.169
      1 86.168.206.46
      1 79.77.175.210
      1 46.19.141.238
      1 206.221.184.2
      1 192.198.95.6

내가 달성하려는 것은 IP를 호스트 이름과 일치시키는 것입니다.

따라서 어딘가에 저장해 두었고 name=$(IPADDRESSNAME)이름이 IP 주소 81.133.113.200과 일치하면

다음 형식으로 인쇄하고 싶습니다.

  5 81.133.113.200 - IPADDRESSNAME
  4 80.229.142.126
  2 94.136.36.29
  2 92.19.231.69

이 작업을 수행하기 위해 열을 읽었지만 두 열을 주소와 일치하는 항목과 결합하는 방법을 잘 모르겠습니다.

Bash 스크립트를 사용하여 실행 중이므로 여기에 호스트 이름을 저장하겠습니다.

나는 다음과 같은 것을 생각하고 있습니다 :

string=$(netstat -tn 2>/dev/null | awk '/:80 / {print $5}' | sed 's/.*::ffff://' | sed 's/:.*//' | sort | uniq -c | sort -nr)
if [[ $string == "81.133.113.200" ]]
then
  echo "Its XXXXXXXX HOST";
fi

이와 같은 것은 작동하지 않지만 논리는 뒤에 있지만 인라인입니다.

답변1

다음 테스트 버전을 사용해 보세요.

netstat -tn 2>/dev/null | awk '/:80 / {print $5}' | sed 's/.*::ffff://' | sed 's/:.*//' | sor t | uniq -c | sort -nr |\
while read index ipaddress ; do \
  printf "%s " "${index}" ;\
  getent hosts "${ipaddress}" ;\
  if [ $? -eq 2 ]; then \
    printf "%s\n" "${ipaddress}" ;\
  fi ;\
done

표준을 사용하고 있습니다얻다문의하기주인주어진 IP 주소를 기반으로 호스트 이름을 검색하는 데이터베이스입니다.

시험을 치르다:

5 81.133.113.200  host81-133-113-200.in-addr.btopenworld.com
4 80.229.142.126  garnerhome.plus.com
2 94.136.36.29    mail.e-trackit.co.uk
2 92.19.231.69    host-92-19-231-69.static.as13285.net
2 85.159.56.230
2 83.70.246.152   83-70-246-152-dynamic.b-ras1.prp.dublin.eircom.net
2 81.131.118.236  host81-131-118-236.range81-131.btcentralplus.com
2 185.106.92.42
1 92.19.232.88    host-92-19-232-88.static.as13285.net
...

답변2

콘텐츠를 삭제하는 대신 Sed를 사용하여 줄을 추가할 수 있다는 사실을 잊어버렸습니다. 그래서 Sed를 사용하여 문자열을 찾고 그 뒤에 줄을 추가합니다. 생각해보면 아주 간단합니다.

열로 출력하여 상황을 너무 복잡하게 만드는 것 같습니다.

간단한 라이너를 예로 들어보겠습니다.

  netstat -tn 2>/dev/null | awk '/:80 / {print $5}' | sed 's/.*::ffff://' | sed 's/:.*//' | sed '/8.8.8.8/s/$/ Its Google/' | sort | uniq -c | sort -nr

답변3

출력을 한 줄씩 처리하고 요구 사항에 따라 인쇄할 수 있습니다. /etc/hosts의 주소를 호스트 이름에 매핑한다고 가정하면 다음을 수행할 수 있습니다.

get_connected_hosts() {
  netstat -tn 2>/dev/null | awk '/:80 / {print $5}' | sed 's/.*::ffff://' | sed 's/:.*//' | sort | uniq -c | sort -nr
}

get_connected_hosts | while read line; do
  set -- $line
  result=$(grep $2 /etc/hosts | head -1 | awk '{ print $2 }')
  # or a reverse DNS lookup, result=$(dig +short -x $2)
  echo "$1 $2 - $result"
done | column -t

답변4

netstat -tn | awk '/:80 / {print $5}' | sed -e 's/:.*//' | 
    xargs -i sh -c 'echo {} $(getent hosts {})' | 
    awk '$1 == $2 {print $2, $3; next}; {print}' | 
    sort | uniq -c | sort -nr

(모두 한 줄에 있을 수 있습니다. 가로 스크롤 막대를 방지하고 더 읽기 쉽게 만들기 위해 줄바꿈을 추가했습니다.)

이는 조회를 사용합니다 xargs -i(암시적 사용 -L 1).getent hosts앞으로Run 조회에서 아무것도 반환하지 않으면 출력이 생성되지 않으므로 sort | uniq -c필요 이상으로 복잡합니다. 따라서 두 번째 작업을 수행하여 한 줄에 IP 주소 하나만 인쇄되도록 해야 합니다.getentechogetentawk

다른 대안은 을 사용 nslookup하거나 IP에서 호스트 이름 조회 dig -xhost -i수행하는 것이지만, 이 모든 방법에는 출력에 대한 추가 처리가 필요합니다.

첫 번째 줄의 이후는 실제로 필요하지 않습니다. s 함수를 사용하여 인쇄하기 전에 동일한 수정을 할 수 있지만 sed, 이것이 더 읽기 쉽고 이해하기 쉽다고 생각합니다.awkawkgsub()$5

관련 정보