最近知った驚きは、Bash が tcp 接続をファイル記述子としてネイティブにサポートしていることです。使用するには:
exec 6<>/dev/tcp/ip.addr.of.server/445
echo -e "GET / HTTP/1.0\n" >&6
cat <&6
0、1、2 は stdin、stdout、および stderr であるため、ファイル記述子として 6 を使用しています。 5 は Bash によって子プロセスに使用されることがあるため、3、4、6、7、8、および 9 は安全なはずです。
以下のコメントに従って、ローカル サーバーでのリスニングをテストするには スクリプト内:
exec 6<>/dev/tcp/127.0.0.1/445 || echo "No one is listening!"
exec 6>&- # close output connection
exec 6<&- # close input connection
誰かが聞いているかどうかを判断するには、ループバックで接続を試みます。失敗した場合は、ポートが閉じているか、アクセスが許可されていません。その後、接続を閉じます。
メールの送信、失敗時のスクリプトの終了、必要なサービスの開始など、ユースケースに合わせてこれを変更してください。
ここに「迅速な回答」の非常に短い説明があります:リモート TCP ポートがシェル スクリプトから開かれているかどうかをテストする方法は?
nc -z <host> <port>; echo $?
「リモート」アドレスとして 127.0.0.1 で使用します。
これは、ポートが開いている場合は「0」を返し、ポートが閉じている場合は「1」を返します
例
nc -z 127.0.0.1 80; echo $?
<ブロック引用> -z nc がリッスン デーモンにデータを送信せずにスキャンするだけであることを指定します。このオプションを -l オプションと一緒に使用するとエラーになります。
この方法で netstat を使用すると、はるかに高速な結果を得ることができます:
Linux の場合:
netstat -lnt | awk '$6 == "LISTEN" && $4 ~ /\.445$/'
Mac の場合:
netstat -anp tcp | awk '$6 == "LISTEN" && $4 ~ /\.445$/'
これにより、ポート (この例では 445) でリッスンしているプロセスのリストが出力されるか、ポートが空いている場合は何も出力されません。
これには netcat を使用できます。
nc ip port < /dev/null
サーバーに接続し、再び接続を直接閉じます。 netcat が接続できない場合、ゼロ以外の終了コードを返します。終了コードは変数 $? に格納されます。例として、
nc ip port < /dev/null; echo $?
netcat がポートに正常に接続できた場合にのみ、0 を返します。