Ssh

ssh 在不被要求的情況下讀取標準輸入

  • January 26, 2022

這些不做同樣的事情:

$ seq 1000000 | (ssh localhost sleep 1; wc -l)
675173
$ seq 1000000 | (ssh localhost sleep 1 </dev/null; wc -l)
1000000

ssh閱讀標準輸入的理由是什麼?

ssh 總是讀取標準輸入,除非您告訴它不要使用-n選項(或-f選項)。

原因是你可以做類似的事情

tar cf - somedir | ssh otherhost "tar xf -"

它總是這樣做,因為 ssh 無法知道您的遠端命令是否接受輸入。

可能在您的第一個命令中發生的情況是 seq 填滿了網路和管道緩衝區(seq -> ssh -> sleep),並且由於 sleep 沒有讀取任何內容,它被阻塞等待更多讀取,然後 sleep 退出,導致那些完整的緩衝區被轉儲,然後 seq 被解除阻塞,將剩餘部分提供給 wc。

請注意,您會得到類似的結果seq 1000000 | ( cat | cat | sleep 1; wc -l)

在您的第二個命令中,它仍在讀取標準輸入,但您已從外部將 /dev/null 分配給標準輸入。

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