2016-03-16 87 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”。无论如何感谢您的快速反应(和正确的答案)。 –