Netcat

使用 netcat 和 tee 的不同重定向樣式給出不同的結果

  • May 16, 2012

在嘗試使用 跟踪一個簡單的 HTTP GET 請求及其響應時nc,我遇到了一些奇怪的事情。

例如,這可以正常工作:in文件最終包含 HTTP GET 請求,而out文件包含響應。

$ mkfifo p
$ (nc -l 4000 < p | tee in | nc web-server 80 | tee out p)&
[1] 8299
$ echo "GET /sample" | nc localhost 4000
This is contents of /sample...
$ cat out
This is contents of /sample...
$

但是,如果我將tee out p上面的內容替換為tee out >p,則out文件結果為空。

$ (nc -l 4000 < p | tee in | nc web-server 80 | tee out > p)&
[1] 8312
$ echo "GET /sample" | nc localhost 4000
$ cat out
$ 

為什麼會這樣?

**編輯:**我在 RHEL 5.3(方法)上。

問題是您正在使用 shell 重定向來讀取和寫入同一個文件。之後檢查p,它也將是空的。shell 以讀取模式打開它,截斷文件,同時在執行命令之前設置管道。但是,使用tee,因為它會打開文件本身,這意味著文件在為輸入讀取內容之前不會被截斷。這是一個眾所周知且記錄在案的行為,也是您不能簡單地使用重定向對文件進行內聯更改的原因。

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