Ssh

我粘貼的輸入在哪裡?

  • June 25, 2018

我正在將 shell 命令序列複製並粘貼到我的終端模擬器中,我對這種行為感到困惑。

  • 當我粘貼單行時ssh user@remote "echo foo"; echo baz,電腦會執行我期望的操作。它執行 SSH 命令,然後在我完成 SSH 會話後回顯某些內容。
  • 但是,當我粘貼與多行命令相同的內容時,不會發生這種情況。
ssh user@remote "echo foo"
迴聲重擊

我仍然得到 SSH 會話,但echo baz完全消失了。沒有命令執行。

  • 至少,這似乎與 SSH 有關。因為用其他東西替換 SSH 會產生我實際期望的行為。當我粘貼這個時,這兩個命令都會執行,例如:
迴聲富
迴聲重擊

那麼發生了什麼?粘貼的輸入去哪裡了?為什麼 echo 命令沒有被任何東西執行?這與 SSH 有什麼關係?

(順便說一句:我知道Ctrl+ XCtrl+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/nullssh

ssh -n user@host 'echo foo'
echo bar

不幸的是我不知道粘貼的機制,所以我不能說為什麼粘貼的數據最終會出現在標準輸入流上ssh,但我猜這與從互動式繼承的流有關shell(從標準輸入讀取命令)。


使用ssh -n也是問題的解決方案(或至少解決方案)

while read something; do
   ssh user@host 'somecommand'
done <inputfile

在這裡,循環只會執行一次,因為sshinputfile.

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