ホスト上の特定のポートが開いているかどうかをテストしようとしています。使ってます:
nc -z Host 22
nc -z Host 80
nc -z Host 443
nc -z Host 8080
これは機能しますが、次のようなワンライナーを使用すると便利です。
nc -z Host 22 80 443 8080
これは機能しません。
確認したいポート番号に大きなギャップがあるため、可能であれば、マニュアルページに記載されているポート範囲nc -z Host 22-8080
を避けたい。また、すべてのポートをスキャンして、開いているポートをスキャンしているように見られたくありません。
Bashループを作成する前に、ポートが開いているかどうかをテストするためのオプションは何ですか?数十のホストがあり、それぞれにチェックするポートがいくつかあります。
以下の-w 1
を使用して、タイムアウトを1秒に制限しています。また、コメントに記載されている理由から-v
を使用しています。逆引きDNSルックアップの遅延を拒否するために-n
を使用しました...
[mpenning@tsunami ~]$ for i in $(echo "172.16.1.1,172.16.1.5"|tr "," "\n"); do echo -e "22\n80\n443\n8080" | xargs -i nc -w 1 -zvn $i {}; done
(UNKNOWN) [172.16.1.1] 22 (ssh) open
(UNKNOWN) [172.16.1.1] 80 (www) : Connection timed out
(UNKNOWN) [172.16.1.1] 443 (https) open
(UNKNOWN) [172.16.1.1] 8080 (http-alt) : Connection timed out
(UNKNOWN) [172.16.1.5] 22 (ssh) open
(UNKNOWN) [172.16.1.5] 80 (www) open
(UNKNOWN) [172.16.1.5] 443 (https) open
(UNKNOWN) [172.16.1.5] 8080 (http-alt) : Connection refused
[mpenning@tsunami ~]$
GNU Parallel が好きなら、これを試してください:
parallel nc -vz Host ::: 22 80 443 8080
出力例:
Connection to foo.example.com 22 port [tcp/ssh] succeeded!
nc: connect to foo.example.com port 80 (tcp) failed: Connection refused
nc: connect to foo.example.com port 443 (tcp) failed: Connection refused
nc: connect to foo.example.com port 8080 (tcp) failed: Connection refused
この方法は、シリアルではなくポートへの接続を並行してテストするため、場合によってはより高速です。具体的には、これはリモートホスト(または介在するファイアウォール)がパケットを破棄してステルスを維持する場所です(接続の成功や強制的な拒否とは対照的です)。
ヒント:ほとんどのLinuxディストリビューションでは、パッケージマネージャーからparallel
をインストールできます。
更新:parallel
を使用すると、これは非常によく一般化され、複数のホストx複数のポートの必要になることが多いケースをカバーします。次の例では、parallel
を使用してクロス積を反復処理しているため、ネストされたループを作成する必要はありません。
parallel nc -vz ::: Host1 Host2 Host3 ::: 22 80 443 8080
出力:
Connection to Host1 22 port [tcp/ssh] succeeded!
Connection to Host1 80 port [tcp/http] succeeded!
Connection to Host1 443 port [tcp/https] succeeded!
nc: connect to Host1 port 8080 (tcp) failed: Connection refused
Connection to Host2 22 port [tcp/ssh] succeeded!
nc: connect to Host2 port 80 (tcp) failed: Connection refused
nc: connect to Host2 port 443 (tcp) failed: Connection refused
nc: connect to Host2 port 8080 (tcp) failed: Connection refused
Connection to Host3 22 port [tcp/ssh] succeeded!
nc: connect to Host3 port 80 (tcp) failed: Connection refused
nc: connect to Host3 port 8080 (tcp) failed: Connection refused
nc: connect to Host3 port 443 (tcp) failed: Connection refused
前の例と同様に、parallel
は接続テストを並行して実行します。デフォルトの並列処理はシステムのスレッド数ですが、-j
スイッチを任意の値に変更することで簡単にオーバーライドできます。ソケットのテストはCPUを集中的に使用するタスクではないため、parallel -j 50 ...
以上で簡単に回避できます。
コメントはnmapがここでより良いオプションであることを示唆しているので、Netcatは実際にはスキャナーではありません。ポート範囲オプションを使用していないシェルスクリプトでラップする必要があると思います。
for Host in $(cat hostlist); do
for port in $ports; do nc -z $Host $port; done
done
等..
Gentoo Linux(net-analyzer/netcat-110-r9がインストールされている場合):
$ nc -vz www.example.com 80 443
www.example.com [93.184.216.34] 80 (http) open
$ nc -vvz www.example.com 80 443
www.example.com [93.184.216.34] 80 (http) open
www.example.com [93.184.216.34] 443 (https) : Connection refused
Redhat 6では、次のようなものを真のワンライナーとして実行できます。
nc -znv -w 2 <Host> <port1>; nc -znv -w 2 <Host> <port2>
-zテストポート
-nはDNSを解決しません
-v詳細な出力を提供します
-w 2秒後のタイムアウト
;もう一度入力するのを気にしない限り、コマンドを次々とつなげます。
複数のポートをスキャンしている場合にループを使用するための提案が好きですが、2または3で、SSHなどでリストをループしようとしている場合は、このような文字列コマンドが便利です。