为什么我在 bash 中的 sudo 命令无法通过 crontab 执行



这是我的简单 runme.sh:

#!/bin/bash
/bin/echo 'CbEYKFKt' | /usr/bin/sudo -S /bin/su -c "whoami;/etc/init.d/iptables stop"

其中,'CbEYKFKt'是当前用户的密码:samX,具有root权限(在visudo中附加了"samX ALL=(ALL:ALL) ALL")。我打算在 crontab 中的特定时间停止 iptables,但是当时间结束时,iptables 服务没有任何反应。不过,如果我执行bash runme.sh,它将正常工作。

我的 crontab 如下:

58 16 * * * /bin/bash /home/data/samX/runme.sh 2>&1 > /home/data/samX/log_cron

不会将任何内容打印到log_cron文件中。我的代码有什么问题吗?提前谢谢。

附言我将2>&1移到末尾后打印了一个错误:

须藤

:对不起,你必须有一个TTY才能运行须藤

有谁知道这意味着什么?

sudo这样的认证实用程序通常从控制终端读取密码(例如通过/dev/tty,参见tty(4)),而不是从标准输入。(但是您可以将-S传递给sudo,要求它在stdin上读取密码)

您可以使用期望(能够处理终端),但您可以简单地配置/etc/sudoers以禁用密码检查。

例如,你可以有一行像

%sudo   ALL=NOPASSWD:  ALL

在您的/etc/sudoers文件中。它将允许sudo组的任何成员在不键入任何密码的情况下使用sudo

这当然会在您的计算机中打开一个安全漏洞。这样做的风险

自负。

最后,你可以小心地将脚本包装在一个setuid可执行文件中(用C仔细编写这样的程序,然后chmod u+s可执行文件)。

与其将所有命令放在一行中,不如正常编写代码并将其分成几行:

#!/bin/bash
echo "CbEYKFKt" | sudo -S echo && sudo -s <<EOF
#put your code here
#All codes will be executed as sudo
EOF

相关内容

  • 没有找到相关文章

最新更新