/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
リダイレクト順序を逆にし、bash
stderrが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 +++
$