➜ cat nmap/ports.nmap
Starting Nmap 7.92 ( https://nmap.org ) at 2022-10-21 11:30 IST
Warning: 10.10.10.100 giving up on port because retransmission cap hit (10).
Nmap scan report for 10.10.10.100
Host is up (0.26s latency).
Not shown: 65410 closed tcp ports (reset), 111 filtered tcp ports (no-response)
PORT STATE SERVICE
88/tcp open kerberos-sec
135/tcp open msrpc
139/tcp open netbios-ssn
389/tcp open ldap
445/tcp open microsoft-ds
464/tcp open kpasswd5
593/tcp open http-rpc-epmap
636/tcp open ldapssl
49152/tcp open unknown
49153/tcp open unknown
49154/tcp open unknown
49155/tcp open unknown
49157/tcp open unknown
49158/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 17.57 seconds
검색 후 이 명령을 사용합니다.
cat nmap/ports.nmap | grep 'open' | awk '{ print $1 }' | awk '{print ($0+0)}' | sed -z 's/\n/,/g;s/,$/\n/'
산출:
88,135,139,389,445,464,593,636,49152,49153,49154,49155,49157,49158
이보다 더 간단한 명령이 있습니까? 누구든지 나를 도와줄 수 있습니까?
답변1
nmap
필요한 정보를 더 쉽게 추출할 수 있는 XML 출력을 사용할 수도 있습니다 .
여기서는 스캔 결과에서 열려 있는 각 포트의 포트 번호를 가져온 xmlstarlet
다음 paste
쉼표로 구분된 필드를 사용하여 포트 번호 행의 형식을 한 줄로 지정하는 데 사용합니다.
$ nmap -oX - localhost | xmlstarlet sel -t -v '//port[state/@state="open"]/@portid' -nl | paste -s -d, -
22,25,111,2049,7000,7001
결과를 먼저 저장하려면 다음 두 단계를 수행하면 됩니다.
$ nmap -oX nmap.xml localhost
Starting Nmap 7.93 ( https://nmap.org ) at 2022-10-21 08:53 CEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000057s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 994 closed tcp ports (conn-refused)
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
111/tcp open rpcbind
2049/tcp open nfs
7000/tcp open afs3-fileserver
7001/tcp open afs3-callback
Nmap done: 1 IP address (1 host up) scanned in 6.13 seconds
$ xmlstarlet sel -t -v '//port[state/@state="open"]/@portid' -nl nmap.xml | paste -s -d, -
22,25,111,2049,7000,7001
XPath 쿼리는 하위 노드와 value 속성 값이 있는 XML 문서의 //port[state/@state="open"]/@portid
모든 노드를 찾습니다. 이러한 각 노드에 대해 속성이 추출됩니다.port
state
state
open
port
portid
이미 가지고 있는 것에 대한 변형을 원하는 경우 대부분의 구문 분석을 단일 awk
호출로 결합할 수 있습니다.
awk '$2 == "open" { sub("/.*","",$1); print $1 }' nmap.out | paste -s -d, -
open
이는 두 번째 필드에서 단어를 감지하고 /
첫 번째 필드에서 그 단어 앞의 모든 것을 추출하여 인쇄합니다. paste
이전과 같이 쉼표로 구분된 목록을 만듭니다 .
답변2
cat nmap/ports.nmap | awk -F/ '/open/ {b=b","$1} END {print substr(b,2)}'
그냥 awk를 사용하나요?
88,135,139,389,445,464,593,636,49152,49153,49154,49155,49157,49158
답변3
원래 명령:
cat nmap/ports.nmap | grep 'open' | awk '{ print $1 }' | awk '{print ($0+0)}' | sed -z 's/\n/,/g;s/,$/\n/'
중복 포트 정렬 및 제거 명령:
cat nmap/ports.nmap | grep 'open' | awk '{ print $1 }' | awk '{print ($0+0)}' | sort | uniq | sed -z 's/\n/,/g;s/,$/\n/'