通过bash和ssh直接传递引号和其他特殊字符

我试图运行一个SSH命令,将调用远程计算机上的一些脚本,将一些Lua代码写入文件。

我有这个在bash下执行的脚本命令:

ssh bob writelua.sh '{version=1,{["foo"]=17}}' 

writelua.sh看起来像这样:

 echo "return $1" > bar.lua 

但最终的结果是, bar.lua的内容是:

 return version=1 

我以为单引号阻止了所有的解释。 我如何编辑脚本并转义通过未经处理的原始Lua代码?

单引号会阻止对本地主机的解释。 远程主机看到命令行

 writelua.sh {version=1,{["foo"]=17}} 

这是受到支撑扩张。 您需要第二组引号,以便将第一组单引号传递给远程主机。

 ssh bob writelua.sh "'{version=1,{[\"foo\"]=17}}'" 

正如你所看到的,报价开始变得笨拙。 一个更好的解决方案是简单地复制一个脚本包含

 writelua.sh '{version=1,{["foo"]=17}}' 

到远程主机并远程执行。


使用$'...'引号的例子:

 ssh bob writelua.sh $'{version=1,{[\'foo\']=17}}' 

使用heredoc避免所有的过度引用

 ssh -T bob << \EOF writelua.sh '{version=1,{["foo"]=17}}' EOF 

这将发送原始脚本到远程主机,它将在远程主机上解释。