적어도 하나의 열린 포트가 있는 것으로 확인된 모든 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 호출을 제거하는 데 도움이 되거나 호출을 향상시킬 수 있는 경우 편집하십시오.