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

时间:2013-10-14 17:33:39

标签: linux bash shell ssh lua

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

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

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

writelua.sh看起来像这样:

echo "return $1" > bar.lua

然而,最终结果是bar.lua具有内容:

return version=1

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

4 个答案:

答案 0 :(得分:4)

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

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}}'

答案 1 :(得分:1)

使用heredoc避免所有过度引用

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

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

答案 2 :(得分:0)

当它变得太复杂(尤其是带有大量转义)时,我更喜欢在临时脚本上生成命令,并根据需要通过SSH在本地或远程执行。

但是还有另一种选择:使用$header_options = [ 'headers' => [ ... 'Content-Type' => 'text/xml', // also try 'application/xml' ... ], ... ]; 将命令存储在变量中并利用三件事:

  • 单引号不会进行变量扩展,并且允许双引号,因此您可以在不转义echo"$myvar"的情况下加入类似$的内容
  • 双引号允许变量扩展和单引号,这意味着您可以包含"之类的内容,以animals='all'; echo love $animals替换其值,而不必转义$animals
  • 两种类型的字符串,即用单引号或双引号引起来的字符串,只需将它们放在一起即可进行串联。

例如,如果我想要在远程计算机上执行类似的操作:

'

但是我不想传递source /my-env.sh; perl -MMYLIB::DB -e 'my $t=db_list("name", 1553786458); print "@$t"' 来传递局部变量的值:

1553786458

我们可以这样:

now=`date +%s`

您会看到单引号和双引号交替出现,因此我们不必进行任何转义!它们不需要用空格隔开,但是在这种情况下,它提高了可读性并且不会影响结果。

现在我们可以执行:

get_list=`echo 'source /my-env.sh; perl -MMYLIB::DB -e' "'my " '$t=db_list("name", ' "$now" '); print "@$t"' "'"`

仍然不能保证这种方法将一直有效,因此一旦构建了命令,最安全的选择就是将其复制到文件中。

答案 3 :(得分:0)

如果可以使用Perl ...

use Net::OpenSSH;
my $ssh = Net::OpenSSH->new("bob");
$ssh->system('writelua.sh', '{version=1,{["foo"]=17}}')
  or die $ssh->error;

Net::OpenSSH为您照顾quoting的一切。