私は見つけたこちらです特定のポートでホストにアクセスできるかどうかを確認する方法ですが、コマンドのステータス コードのみに関心があるため、次のような方法を試しています。
[CptBartender@somewhere ~]$ <dev/tcp/host/port ; echo $?
0
開いているポートで試すと正常に動作しますが、閉じているポートを確認すると次のようになります。
[CptBartender@somewhere ~]$ <dev/tcp/host/blocked_port ; echo $?
-bash: connect: Connection refused
-bash: /dev/tcp/host/blocked_port: Connection refused
1
次のステップでは、最初のコマンドの出力を破棄してみることにしました。そこで、次の操作を試しました。
[CptBartender@somewhere ~]$ <dev/tcp/host/blocked_port >/dev/null/ 2>&1; echo $?
-bash: connect: Connection refused
-bash: /dev/tcp/host/blocked_port: Connection refused
1
出力は同じです。私の質問は、最初のコマンドがなぜ何らかの出力を印刷するのか、そしてそれをどのように防ぐのかということです。
答え1
それは指示それは印刷出力です。どれでもコマンド – は< /dev/tcp/…
単なる通常の入力リダイレクトシェル自体によって処理されます。
(それだけでなく、リダイレクトは左から右に処理されるため、<
リダイレクトは前にリダイレクトできなかっ2>&1
たともかく。
この問題を回避するには、サブシェルで「コマンド」を実行します。例:
( </dev/tcp/$host/$port ) 2>/dev/null
実際のところ、この場合サブシェルは必要ないようです。コマンド グループは同じプロセス内にある場合でも機能しますが、それでも「外部」リダイレクトが最初に処理されるように強制します。
{ </dev/tcp/$host/$port; } 2>/dev/null
補足:/dev/tcp
は bash 自体によって処理される魔法のパスです。Linux の /dev には実際には存在しませんが、bash のリダイレクトで使用できます。ただし、このトリックは では機能しません#!/bin/sh
。また、一部の古いシステム (この機能が無効になっていた) や一部の非 Linux システム上の bash では機能しない可能性があります。