為什麼需要 < 或 > 才能使用 /dev/tcp
嘗試打電話時
/dev/tcp/www.google.com/80
,通過鍵入/dev/tcp/www.google.com/80
巴什說
no such file or directory
。線上查看其他人的程式碼時,他們使用的語法如3<>/dev/tcp/www.google.com/80
我注意到這也有效:
</dev/tcp/www.google.com/80
為什麼在 bash 中呼叫某些東西需要這些符號?
因為這是 shell(ksh 的,由 bash 複製)的一個特性,而且只有 shell。
/dev/tcp/...
不是真正的文件,shell 會攔截重定向到/dev/tcp/...
文件的嘗試,然後在這種情況下執行socket(...);connect(...)
(建立 TCP 連接)而不是open("/dev/tcp/..."...)
(打開該文件)。請注意,它必須這樣拼寫。
cat < /dev/./tcp/...
或者///dev/tcp/...
不起作用,而是嘗試打開這些文件(在大多數係統上這些文件不存在,您會收到錯誤消息)。重定向的方向也無關緊要。無論您使用
3< /dev/tcp/...
或什3> /dev/tcp/...
至不會產生任何影響,您都可以從/向該文件描述符讀取和寫入,以通過該 TCP 套接字接收/發送數據。3<> /dev/tcp/...``3>> /dev/tcp/...
當您這樣做
cat /dev/tcp/...
時,這不起作用,因為cat
沒有實現相同的特殊處理,它對open("/dev/tcp/...")
每個文件(除了-
)都執行類似操作,只有 shell(僅限 ksh,bash)執行,並且僅針對重定向目標。這
cat -
是另一個特殊處理的文件路徑範例,這次是由cat
,而不是 shell。不是
open("-")
從生成的文件描述符中cat
讀取輸入,而是直接從文件描述符 0 (stdin) 中讀取。cat
許多文本實用程序都這樣做,shell 不用於重定向。要讀取-
文件的內容,您需要cat ./-
, 或cat < -
(或cat - < -
)。但是,在沒有 have 的系統上/dev/stdin
,bash
將對來自該(虛擬)文件的重定向執行類似的操作。GNU對,awk
執行相同的操作/dev/stdin
,即使在確實具有此類文件的系統上也可能會在這些文件行為不同的 Linux 等系統上引起一些意外。/dev/stdout``/dev/stderr
zsh
還具有 TCP(和 Unix 域流)套接字支持,但這是通過ztcp
(andzsocket
) 內置函式完成的,因此它的限制小於 ksh/bash 方法。特別是,它還可以充當 ksh/bash 無法做到的伺服器。儘管如此,它仍然比你在真正的程式語言中所能做的要有限得多。