运行 通过 ssh 命令遇到问题

Having trouble with running a command over ssh

此命令未按预期工作:

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$()。我假设这是更好的替代品。