2015-08-28 228 views
1

我有一个小问题:在SSH命令中加入su -c命令无法在其中运行命令

我想在Crontab中回显一些带有反引号的服务器。 继承人我的样本命令:

for server in $(cat list); do ssh -t [email protected]$server "su -c \"echo '35 * * * * $script_that_runs ''\'\`/bin/hostname\`''\' $Parameter2 $Parameter3' >> /var/spool/cron/crontabs/root \" "; done 

在REMOTESERVER它显示了像:

35 * * * * $script_that_runs '$hostname' $Parameter2 $Parameter3 

但我想用那种方式:

35 * * * * $script_that_runs `/bin/hostname` $Parameter2 $Parameter3 

我还没有找到一个答案。也许我只是愚蠢地找到一个。 有没有人得到这个解决方案?

问题是:

  • ,如果我的su -c单引号,它不会工作
  • 如果我不是逃避echo命令在实际目录中的所有文件将中回显crontab。

命令与最好的结果:

for server in $(echo $servername); do ssh -t [email protected]$server "su -c \"echo '35 * * * * /usr/lib/nagios/plugins/nsca_wrapper \`\`/bin/hostname\`\` apt-check /usr/lib/nagios/plugins/check_apt' >> /var/spool/cron/crontabs/root \" "; done 
+0

我想你需要双转义字符,因为它被评估两次。一旦进入终端,第二次进入远程终端。 – Jakuje

+0

似乎不适合我。 (结果:/ bin/hostname已经安装了/ bin/hostname'(没有反引号)) – Mamoru

+0

刚刚尝试过你的代码,我得到的语法错误。你可以提供一个简单的例子,但不包括循环,变量和内容会工作? – Jakuje

回答

0

您应仔细逃脱

` 

性格像这样

\\\` 

例用最少的代码:

$ ssh -t host "su -c \"echo 'something \\\`/bin/hostname\\\`' > /tmp/test \"; cat /tmp/test "; 
something `/bin/hostname` 
+0

我以为我已经尝试过了。 NVM。 现在有效。谢谢:-D – Mamoru