Shell

不一致的重定向行為 ssh 互動 vs 命令

  • August 14, 2014

這些工作,

ssh remote 'echo hi > hi.txt'
echo hi | ssh remote 'cat > hi.txt'

但這不起作用

ssh remote sh -c 'echo hi > hi.txt'

我希望在遠端生成一個名為 hi.txt 的文件,其中包含“hi”。相反,我得到一個名為 hi.txt的空文件。

以下給出了從互動式 ssh 會話執行時的預期行為。

sh -c 'echo hi > hi.txt'

我對 ssh 和重定向有什麼誤解?

我認為您的本地外殼正在剝離您的引號。你可以試試

ssh remote sh -c '"echo hi > hi.txt"'

當您使用 ssh 發送遠端命令時,讀取發送的每一行都涉及兩個 shell。您的本地 shell 和遠端 shell。

可以在Unix/Linux Shell Quoting for remote shell中找到對此的一個很好的解釋

這可能是使用 ssh 時最令人困惑和最煩人的事情(至少在我看來)。

這種行為的原因是 ssh 在執行遠端命令時不保留參數。它接受你所有的參數,並將它們連接在一起,用空格分隔。

所以當你跑

ssh remote sh -c 'echo hi > hi.txt'

實際上,您正在執行的是:

ssh remote 'sh -c echo hi > hi.txt'

這將執行sh -c echo,將 shell(notecho)傳遞給(未使用)的參數hi,並將輸出重定向到hi.txt.

 

chthonous(嵌套引用)提供的解決方案是解決此問題的一種方法。讓我們看一下:

ssh remote sh -c '"echo hi > hi.txt"'

這裡發生的事情是 ssh 正在連接所有參數,因此您實際上最終得到:

ssh remote 'sh -c "echo hi > hi.txt"'

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