此命令未按预期工作:

ssh root@<machineIP> -- sh -c "echo \$\(cat /tmp/testfile\) > /testfile"

我的目的是将/tmp/testfile的内容复制到/testfile。很简单。但我发现/testfile中没有任何内容。文件被创建(在它不存在的情况下)。
如果从远程服务器上的命令行运行,echo命令可以正常工作(减去转义)。但通过ssh运行时不起作用。最初,我实际上有一个更复杂的“sed”命令,但简化了不起作用的部分。
远程和本地服务器都是CentOS7。
我发现我不得不逃出$和()。这会给我带来麻烦吗?不是运行此命令的正确方法吗?

最佳答案

ssh将获取所有命令参数,在空格上连接它们,然后在远程shell中运行它们。
这意味着执行的命令基本上就是用ssh替换echo时得到的:

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

引号丢失,因此生成的命令相当于sh -c echo > /testfile使其为空。
相反,只需接受要运行的命令并用单引号将其括起来:
ssh root@host 'echo $(cat /tmp/testfile) > /testfile'

不过,请确保在复制文件时不要使用echo$()。我想这是更好的选择。

09-04 20:16