Io-Redirection

Stdout / stderr 重定向無法防止 /dev/tcp/host/port 重定向錯誤

  • February 5, 2020

這是正常的重定向。

user@linux:~$ randomcommand
randomcommand: command not found
user@linux:~$ 

2>

user@linux:~$ randomcommand 2> /dev/null
user@linux:~$ 

&>

user@linux:~$ randomcommand &> /dev/null
user@linux:~$ 

但是,當我嘗試使用不同的命令執行相同操作時,它不起作用,如下所示。

&>

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

2>

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

這些語法有什麼問題以及如何解決?

bash處理> /dev/tcp/localhost/22重定向時輸出錯誤,此時 stderr 尚未被重定向。只需更改這兩個重定向的順序:

if 2> /dev/null > /dev/tcp/127.0.0.1/22; then
 echo open
else
 echo closed
fi

請注意,這些/dev/tcp/host/port不是真實文件。bash(或ksh該功能的來源)檢測到您正在嘗試重定向到那些特殊文件的事實(您會注意到,如果您將其更改為/dev/./tcp/dev//tcp它不再工作),而不是打開這些文件,而是創建一個 TCP 套接字並嘗試connect()在主機和埠上進行。並且當connect失敗時bash報告錯誤。

zsh有一個ztcp內置命令(在zsh/net/tcp模組中),這使它更直覺,還允許更多的東西,比如伺服器端連接。

引用自:https://unix.stackexchange.com/questions/565844