Linux

為什麼需要 < 或 > 才能使用 /dev/tcp

  • February 28, 2022

嘗試打電話時/dev/tcp/www.google.com/80,通過鍵入

/dev/tcp/www.google.com/80

巴什說no such file or directory。線上查看其他人的程式碼時,他們使用的語法如

3&lt;&gt;/dev/tcp/www.google.com/80

我注意到這也有效:

&lt;/dev/tcp/www.google.com/80

為什麼在 bash 中呼叫某些東西需要這些符號?

因為這是 shell(ksh 的,由 bash 複製)的一個特性,而且只有 shell。

/dev/tcp/...不是真正的文件,shell 會攔截重定向到/dev/tcp/...文件的嘗試,然後在這種情況下執行socket(...);connect(...)(建立 TCP 連接)而不是open("/dev/tcp/..."...)(打開該文件)。

請注意,它必須這樣拼寫。cat &lt; /dev/./tcp/...或者///dev/tcp/...不起作用,而是嘗試打開這些文件(在大多數係統上這些文件不存在,您會收到錯誤消息)。

重定向的方向也無關緊要。無論您使用3&lt; /dev/tcp/...或什3&gt; /dev/tcp/...至不會產生任何影響,您都可以從/向該文件描述符讀取和寫入,以通過該 TCP 套接字接收/發送數據。3&lt;&gt; /dev/tcp/...``3&gt;&gt; /dev/tcp/...

當您這樣做cat /dev/tcp/...時,這不起作用,因為cat沒有實現相同的特殊處理,它對open("/dev/tcp/...")每個文件(除了-)都執行類似操作,只有 shell(僅限 ksh,bash)執行,並且僅針對重定向目標。

cat -是另一個特殊處理的文件路徑範例,這次是由cat,而不是 shell。

不是open("-")從生成的文件描述符中cat讀取輸入,而是直接從文件描述符 0 (stdin) 中讀取。cat許多文本實用程序都這樣做,shell 不用於重定向。要讀取-文件的內容,您需要cat ./-, 或cat &lt; -(或cat - &lt; -)。但是,在沒有 have 的系統上/dev/stdinbash將對來自該(虛擬)文件的重定向執行類似的操作。GNU對,awk執行相同的操作/dev/stdin,即使在確實具有此類文件的系統上也可能會在這些文件行為不同的 Linux 等系統上引起一些意外。/dev/stdout``/dev/stderr

zsh還具有 TCP(和 Unix 域流)套接字支持,但這是通過ztcp(and zsocket) 內置函式完成的,因此它的限制小於 ksh/bash 方法。特別是,它還可以充當 ksh/bash 無法做到的伺服器。儘管如此,它仍然比你在真正的程式語言中所能做的要有限得多。

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