/dev/tcp/ip/port"から"接続拒否"行を削除する方法">

"">/dev/tcp/ip/port"から"接続拒否"行を削除する方法

/dev/tcp/ip/port"から"接続拒否"行を削除する方法">

オープンポート

user@linux:~$ >/dev/tcp/127.0.0.1/8080 && echo open || echo closed
open
user@linux:~$ 

港を閉じる

user@linux:~$ >/dev/tcp/127.0.0.1/8088 && echo open || echo closed
bash: connect: Connection refused
bash: /dev/tcp/127.0.0.1/8088: Connection refused
closed
user@linux:~$ 

stderrを/ dev / nullにリダイレクトすると機能しません。

user@linux:~$ >/dev/tcp/127.0.0.1/8088 2>/dev/nul
bash: connect: Connection refused
bash: /dev/tcp/127.0.0.1/8088: Connection refused
user@linux:~$ 

希望の出力

user@linux:~$ >/dev/tcp/127.0.0.1/8088 && echo open || echo closed
closed
user@linux:~$ 

ベストアンサー1

リダイレクト順序を逆にし、bashstderrがstdinより前に来なければならないことを教えてください。

$ >/dev/tcp/127.0.0.1/8088 2>/dev/nul
bash: connect: Connection refused
bash: /dev/tcp/127.0.0.1/8088: Connection refused
$ 2>/dev/null >/dev/tcp/127.0.0.1/8088 && echo open || echo closed
closed
$ 

最初のバージョンが失敗する理由は、リダイレクトが発生した順序で処理されるため、そのポートへのリダイレクトが>/dev/tcp/127.0.0.1/8088 2>/dev/null発生したときにstderrストリームがまだリダイレクトされていないためです。ユーティリティを使用すると、診断出力からstderrをリダイレクトする対応するシステムコールdup2()(またはコマンドが失敗した場合はリダイレクト不足)を明確に確認できます。strace

$ strace -e dup2,connect  -f bash -c '>/dev/tcp/127.0.0.1/8088 2>/dev/null'
connect(3, {sa_family=AF_INET, sin_port=htons(8088), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 ECONNREFUSED (Connection refused)
bash: connect: Connection refused
bash: /dev/tcp/127.0.0.1/8088: Connection refused
+++ exited with 1 +++
$ strace -e dup2,connect  -f bash -c '2>/dev/null >/dev/tcp/127.0.0.1/8088 '
dup2(3, 2)                              = 2
connect(3, {sa_family=AF_INET, sin_port=htons(8088), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 ECONNREFUSED (Connection refused)
dup2(10, 2)                             = 2
+++ exited with 1 +++
$ 

おすすめ記事