我正在尝试运行一个SSH命令,该命令将调用远程计算机上的脚本,该脚本将一些Lua代码写入文件。
我有这个在bash下执行的脚本命令:
ssh bob writelua.sh '{version=1,{["foo"]=17}}'
writelua.sh
看起来像这样:
echo "return $1" > bar.lua
然而,最终结果是bar.lua
具有内容:
return version=1
我原以为单引号阻止了所有的解释。如何编辑脚本并转义以通过未受伤害的原始Lua代码传递?
答案 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的一切。