今天我在閱讀nc
手冊頁時偶然發現了這個指令。我知道:
mkfifo /tmp/f
正在建立一個命名管道/tmp/f。cat /tmp/f
正在列印寫入該命名管道的任何內容,並且 的輸出cat /tmp/f
被通過管道傳送到/bin/sh
/bin/sh
正在互動運行,並且 stderr 被重定向到 stdout。- `然後輸出經由管道傳送到正在偵聽連接埠 1234 的 nc
- 輸出最終再次重定向到命名管道。
執行時,連接到該連接埠(即 1234)上的遠端伺服器會開啟 shell 提示符,客戶端可以執行任意命令。但它是如何運作的呢?
答案1
此類命令利用 IO 重定向和 sh 交互模式,該模式在連接到 TTY 時預設為開啟。
請注意,cat 在 FIFO 上保持開啟。這是你的第一個線索。當 sh 運行時,它所做的一切就是將其 stdout 和 strerr 定向到 TTY。相反,sh 不附加到 TTY。通常 sh 在連接到 TTY 時會自動進入互動模式,但因為它沒有添加 -i 選項。這意味著它將繼續接受新命令的輸入。這些命令的輸出被定向到 nc 的標準輸入,並且 nc 的輸出(即透過網路發送的命令)被重定向到 FIFO。
FIFO 本質上被用作命名管道來完成重定向環。
您可以更簡單地將其視為 sh 和 nc 在循環中相互重定向。該命令的其餘部分只是無用的內容。