Netcat
使用 netcat 和 tee 的不同重定向樣式給出不同的結果
在嘗試使用 跟踪一個簡單的 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
,因為它會打開文件本身,這意味著文件在為輸入讀取內容之前不會被截斷。這是一個眾所周知且記錄在案的行為,也是您不能簡單地使用重定向對文件進行內聯更改的原因。