➜ 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
番号行の形式を1行に指定します。
$ nmap -oX - localhost | xmlstarlet sel -t -v '//port[state/@state="open"]/@portid' -nl | paste -s -d, -
22,25,111,2049,7000,7001
結果を最初に保存するには、次の2つの手順を実行します。
$ 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
これは、2番目のフィールドで単語を検出し、/
最初のフィールドからその単語の前のすべてを抽出して印刷します。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/'