Ssh
我粘貼的輸入在哪裡?
我正在將 shell 命令序列複製並粘貼到我的終端模擬器中,我對這種行為感到困惑。
- 當我粘貼單行時
ssh user@remote "echo foo"; echo baz
,電腦會執行我期望的操作。它執行 SSH 命令,然後在我完成 SSH 會話後回顯某些內容。- 但是,當我粘貼與多行命令相同的內容時,不會發生這種情況。
ssh user@remote "echo foo" 迴聲重擊
我仍然得到 SSH 會話,但
echo baz
完全消失了。沒有命令執行。
- 至少,這似乎與 SSH 有關。因為用其他東西替換 SSH 會產生我實際期望的行為。當我粘貼這個時,這兩個命令都會執行,例如:
迴聲富 迴聲重擊
那麼發生了什麼?粘貼的輸入去哪裡了?為什麼 echo 命令沒有被任何東西執行?這與 SSH 有什麼關係?
(順便說一句:我知道
Ctrl
+X
,Ctrl
+E
方法,但有時,尤其是在 Windows 上使用終端仿真器時,這不會開箱即用。)
嘗試粘貼:
ssh user@host 'read foo; echo ">>$foo<<"' echo bar
您將看到伺服器上的
>>echo bar<<
輸出。echo
這意味著
ssh
它將在其標準輸入上吃掉粘貼的數據,就好像你已經完成了一樣echo 'echo bar' | ssh user@host 'read foo; echo ">>$foo<<"'
除了從不將 shell 命令粘貼到終端來執行它們之外,解決此問題的方法是使用
ssh -n
,它將重定向/dev/null
到ssh
:ssh -n user@host 'echo foo' echo bar
不幸的是我不知道粘貼的機制,所以我不能說為什麼粘貼的數據最終會出現在標準輸入流上
ssh
,但我猜這與從互動式繼承的流有關shell(從標準輸入讀取命令)。使用
ssh -n
也是問題的解決方案(或至少是解決方案)while read something; do ssh user@host 'somecommand' done <inputfile
在這裡,循環只會執行一次,因為
ssh
從inputfile
.