Shell
不一致的重定向行為 ssh 互動 vs 命令
這些工作,
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。
這可能是使用 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"'