![awk와 같은 텍스트 유틸리티를 사용하여 IP\t[모든 열려 있는 포트] 목록을 인쇄하기 위해 (grepable) nmap 출력을 구문 분석합니다.](https://linux55.com/image/90214/awk%EC%99%80%20%EA%B0%99%EC%9D%80%20%ED%85%8D%EC%8A%A4%ED%8A%B8%20%EC%9C%A0%ED%8B%B8%EB%A6%AC%ED%8B%B0%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20IP%5Ct%5B%EB%AA%A8%EB%93%A0%20%EC%97%B4%EB%A0%A4%20%EC%9E%88%EB%8A%94%20%ED%8F%AC%ED%8A%B8%5D%20%EB%AA%A9%EB%A1%9D%EC%9D%84%20%EC%9D%B8%EC%87%84%ED%95%98%EA%B8%B0%20%EC%9C%84%ED%95%B4%20(grepable)%20nmap%20%EC%B6%9C%EB%A0%A5%EC%9D%84%20%EA%B5%AC%EB%AC%B8%20%EB%B6%84%EC%84%9D%ED%95%A9%EB%8B%88%EB%8B%A4..png)
적어도 하나의 열린 포트가 있는 것으로 확인된 모든 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 호출을 제거하는 데 도움이 되거나 호출을 향상시킬 수 있는 경우 편집하십시오.