awk와 같은 텍스트 유틸리티를 사용하여 IP\t[모든 열려 있는 포트] 목록을 인쇄하기 위해 (grepable) nmap 출력을 구문 분석합니다.

awk와 같은 텍스트 유틸리티를 사용하여 IP\t[모든 열려 있는 포트] 목록을 인쇄하기 위해 (grepable) nmap 출력을 구문 분석합니다.

적어도 하나의 열린 포트가 있는 것으로 확인된 모든 IP 주소를 인쇄하는 방법을 찾고 싶습니다. 해당 IP 주소 뒤에 쉼표로 구분된 열린 포트 목록을 인쇄하고 싶습니다. 포트와 IP 주소는 탭 구분 기호를 사용하여 구분해야 합니다.

추악한 방법으로 할 수 있습니다. IP 주소를 grep하고 파일에 쓴 다음 IP 주소 결과 파일을 입력 파일로 사용하여 nmap 파일을 다시 grep한 다음 cut 및 sed를 사용하여 열려 있는 포트를 다듬고 작성합니다. 파일을 가져온 다음 두 파일을 결합합니다. 이는 추악한 프로세스이며 극단적인 경우에는 안정적으로 작동하지 않습니다.

awk를 사용하여 한 줄로 이 작업을 수행하는 쉬운 방법이 있습니까? 열려 있는 모든 포트를 찾아서 반환하여 IP 주소와 함께 인쇄할 수 있도록 awk에 함수가 필요하다고 생각하지만 이를 수행하는 방법을 찾지 못했습니다.

소스 데이터 예:

Host: 10.0.0.101 ()Ports: 21/closed/tcp//ftp///, 22/closed/tcp//ssh///, 23/closed/tcp//telnet///, 25/closed/tcp//smtp///, 53/closed/tcp//domain///, 110/closed/tcp//pop3///, 139/open/tcp//netbios-ssn///, 143/closed/tcp//imap///, 445/open/tcp//microsoft-ds///, 3389/closed/tcp//ms-wbt-server///

예상 출력 데이터:

10.0.0.101    139,445

답변1

awk프로그램은 다음을 수행해야 합니다.

$ echo "Host: 10.0.0.101 ()Ports: 21/closed/tcp//ftp///, 22/closed/tcp//ssh///, 23/closed/tcp//telnet///, 25/closed/tcp//smtp///, 53/closed/tcp//domain///, 110/closed/tcp//pop3///, 139/open/tcp//netbios-ssn///, 143/closed/tcp//imap///, 445/open/tcp//microsoft-ds///, 3389/closed/tcp//ms-wbt-server///" |
awk '{printf "%s\t", $2;
      for (i=4;i<=NF;i++) {
        split($i,a,"/");
        if (a[2]=="open") printf ",%s",a[1];}
      print ""}' |
sed -e 's/,//'

10.0.0.101  139,445

질문을 편집하기 전에 출력이 shell 에서 나올 것이라고 가정하고 nmap다음 답변을 준비했습니다.

$ nmap -sT 127.0.0.1-3 |
  awk '/^Nmap scan report/{cHost=$5;}
       /open/ { split($1,a,"/"); result[cHost][a[1]]=""}
       END {
       for (i in result) {
         printf i;
         for (j in result[i])
           printf ",%s", j ;
         print ""} }' |
  sed -e 's/,/\t/'   

localhost   445,25,139,631,22,80
127.0.0.2   445,139,22,80
127.0.0.3   445,139,22,80

설명이 필요하시면 댓글을 남겨주세요. 후행 sed 호출을 제거하는 데 도움이 되거나 호출을 향상시킬 수 있는 경우 편집하십시오.

관련 정보