此命令未按预期工作:
ssh root@<machineIP> -- sh -c "echo \$\(cat /tmp/testfile\) > /testfile"
我的目的是将/ tmp / testfile的内容复制到/ testfile。真的很简单。但我发现/ testfile中没有任何内容。创建文件(在它不存在的情况下)。
如果从远程服务器上的命令行运行,echo命令可以正常工作(减去转义)。但是通过ssh运行它时不起作用。最初我实际上有一个更复杂的命令与#sed&#39;,但简化了没有做到的事情。
远程服务器和本地服务器都是CentOS7。
我发现我必须逃避$和()。这会给我带来麻烦吗?这不是运行此命令的正确方法吗?
答案 0 :(得分:0)
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
或$()
。我认为这是一个更好的替身。