awkなどのテキストユーティリティを使用して、IP \ t [すべての開いているポート]リストを印刷するために(grepable)nmap出力を解析します。

awkなどのテキストユーティリティを使用して、IP \ t [すべての開いているポート]リストを印刷するために(grepable)nmap出力を解析します。

少なくとも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呼び出しを削除するのに役立つ場合、または呼び出しを改善できる場合は編集してください。

関連情報