少なくとも1つの開いているポートがあることが確認されたすべてのIPアドレスを印刷する方法を見つけたいと思います。そのIPアドレスの後にカンマで区切られた開いているポートのリストを印刷したいと思います。ポートとIPアドレスはタブ区切り文字で区切る必要があります。
醜い方法で行うことができます。 IPアドレスをgrepしてファイルに書き込み、IPアドレス結果ファイルを入力ファイルとしてnmapファイルを再度grepし、cutとsedを使用して開いているポートをトリミングして作成します。ファイルをインポートし、2つのファイルを結合します。これは醜いプロセスであり、極端な場合には安定して動作しません。
awkを使って1行でこれを行う簡単な方法はありますか?開いているすべてのポートを見つけて返すことで、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
質問を編集する前に、出力がシェルから出るとし、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呼び出しを削除するのに役立つ場合、または呼び出しを改善できる場合は編集してください。