2016-03-16 139 views
0

此命令運行一個命令時遇到不按預期工作:與通過ssh

ssh [email protected]<machineIP> -- sh -c "echo \$\(cat /tmp/testfile\) > /testfile" 

我的意圖是到/ tmp/testfile的內容複製到/ testfile的。真的很簡單。但是我發現/ testfile沒有任何內容。該文件被創建(如果它不存在)。

如果從遠程服務器上的命令行運行,echo命令正常工作(減去轉義)。但在通過ssh運行時不起作用。本來我實際上有一個更復雜的命令與'sed',但簡化了什麼不工作。

遠程和本地服務器都是CentOS7。我發現我不得不逃脫$和()。這是否導致我的問題?運行此命令的方式不正確嗎?

回答

0

ssh將採取所有的命令參數,將它們加入空格,然後在遠程shell中運行。

這意味着,正在執行的命令,基本上,如果你有echo更換ssh你會得到什麼:

$ echo sh -c "echo \$(cat /tmp/testfile) > /testfile" 
sh -c echo $(cat /tmp/testfile) > /testfile 

丟失,因此所得到的命令是等同於sh -c echo > /testfile這使得空的報價。

相反,只需要你想運行在單引號把它包命令:

ssh [email protected] 'echo $(cat /tmp/testfile) > /testfile' 

確保永不雖然複製文件時使用echo$()。我認爲這是更好的東西的替身。

+0

是的,這個*是一個更好的東西的替身。我把它縮小到這塊,並且很好奇,看看它是否會起作用,並且發現它沒有。你的建議確實奏效!但我不記得爲什麼我改用「 - sh -c」。無論如何感謝您的快速反應(和正確的答案)。 –