nmapスキャン出力ファイルからポートのみをgrepする方法は?

nmapスキャン出力ファイルからポートのみをgrepする方法は?
➜ 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すべてのノードを検索します。これらのノードごとに属性が抽出されます。portstatestateopenportportid


すでに持っているものに対するバリエーションが必要な場合は、ほとんどの解析を単一の呼び出し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/'

関連情報