Io-Redirection
Stdout / stderr 重定向無法防止 /dev/tcp/host/port 重定向錯誤
這是正常的重定向。
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
模組中),這使它更直覺,還允許更多的東西,比如伺服器端連接。