mkfifo /tmp/f ; cat /tmp/f | /bin/bash -i 2>&1 | nc -l -p 1234 > /tmp/f
我是 bash 的新手,我正在嘗試理解這段“代碼”。
- 為什么不需要while回圈?這怎么行?它本身是一個回圈嗎?為什么?如何?此外,
cat filePipe它本身只列印一行,然后退出(我剛剛測驗過),并讓 cat 不退出我這樣做:while cat pipeFile ; do : ; done. 那么上面是如何作業的呢? - 我沒有得到執行的順序......在開始時 /tmp/f 是空的,所以 cat /tmp/f 應該“發送”一個空流到 /bin/bash 它只是將它發送到 nc 打開一個連接并將互動式 bash “發送”給任何連接的人……然后客戶端的回應被發送到 /tmp/f ……然后呢?什么?它怎么能回去再做同樣的事情呢?
uj5u.com熱心網友回復:
/tmp/f 不是空的,而是一個fifo,一個雙向鏈接。

有人連接到埠 1234,輸入一些內容,然后nc將其轉發fifo到bash.
bash運行命令并將結果發送回nc.
uj5u.com熱心網友回復:
bash決議 line時mkfifo /tmp/f ; cat /tmp/f | /bin/bash -i 2>&1 | nc -l -p 1234 > /tmp/f,會發生幾件事。首先,創建fifo。然后,沒有特定的順序,會發生 3 件事:cat啟動、bash啟動和nc啟動,其輸出流連接到/tmp/f. cat現在將阻塞,直到其他行程打開/tmp/f以進行寫入;即將nc這樣做(或者已經這樣做了,但我們不知道是否cat會在之前開始nc或是否nc在之前開始cat,也不知道他們將以什么順序打開先進先出,但無論誰先做都會阻塞,直到另一個完成操作)。一旦所有 3 個行程都啟動,它們就會坐在那里等待一些資料。最終,一些外部行程連接到埠 1234 并將一些資料發送到nc, 寫入/tmp/f. cat(最終)讀取該資料并將其發送到下游bash,后者處理輸入并(可能)將一些資料寫入nc,后者通過套接字連接將其發送回。
如果您有一個僅寫入一行資料的測驗用例cat /tmp/f,那僅僅是因為您過去寫入的任何行程/tmp/f都只寫入了一行。嘗試:printf 'foo\nbar\nbaz\n' > /tmp/f & cat /tmp/f或while sleep 1; do date; done > /tmp/f & cat /tmp/f
uj5u.com熱心網友回復:
.1 你誤解了當你echo "string" >/path/fifo
.a) 當你剛剛echo something >/path/to/somewhere,你
- (然后測驗可訪問性)在某處打開目標以進行寫入
- 在打開的檔案描述符中寫一些東西()
fd - 關閉(放松)訪問的檔案。
.b) 一個fifo(The First I n is the First Out . )不是一個檔案。
嘗試這個:
# 視窗 1:
mkfifo /tmp/fifotest cat /tmp/fifotest
# 視窗 2:
exec {fd2fifo}>/tmp/fifotest echo >&$fd2fifo Foo bar
你會看到cat 沒有終止。
echo >&$fd2fifo Baz exec {fd2fifo}>&-
現在,貓會關閉
所以不需要任何回圈!
.2 命令cat /tmp/f | /bin/bash -i 2>&1 | nc -l -p 1234 > /tmp/f
可以寫成(避免無用的使用cat):
bash -i 2>&1 </tmp/f | nc -l -p 1234 > /tmp/f
但你可以做同樣的操作,但從不同的角度看:
nc -l -p 1234 </tmp/f | bash -i >/tmp/f 2>&1
目標是
- to drive bash's STDIN from
nc's STDOUT and - connect back bash's STDOUT and STDERR to
nc's STDIN.
.3 The more: bashism
Under bash, you could avoid creating fifo by using unnamed fifo:
coproc nc -l -p 1234; bash -i >&${COPROC[1]} 2>&1 <&${COPROC[0]}
or
exec {ncin}<> <(:); nc -l -p 1234 <&$ncin | bash -i >&$ncin 2>&1
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/439458.html
上一篇:Bash-同時從檔案描述符中讀取
