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

时间:2015-04-29 09:38:53

标签: linux bash crontab sudo

这是我的简单runme.sh:

Layout layout = LayoutLocalServiceUtil.getLayout(destinationLayout.getPlid());
    String completeUrl = PortalUtil.getLayoutFullURL(layout, getThemeDisplay());

其中,#!/bin/bash /bin/echo 'CbEYKFKt' | /usr/bin/sudo -S /bin/su -c "whoami;/etc/init.d/iptables stop" 是当前用户的密码:samX,具有root权限(在'CbEYKFKt'中附加"samX ALL=(ALL:ALL) ALL")。我打算在crontab的特定时间停止iptables,但是当时间到了,iptables服务没有发生任何事情。不过,如果我执行visudo,它将正常工作。

我的crontab如下:

bash runme.sh

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

P.S。 我将58 16 * * * /bin/bash /home/data/samX/runme.sh 2>&1 > /home/data/samX/log_cron 移至结尾后打印错误:

sudo:抱歉,你必须有一个tty来运行sudo

有谁知道这意味着什么?

2 个答案:

答案 0 :(得分:1)

sudo等身份验证工具通常会从控制终端读取密码(例如,通过/dev/tty,请参阅tty(4)),而不是标准输入。 (但您可以将-S传递给sudo,要求其在 stdin上读取密码

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

例如,您可以使用

这样的行
%sudo   ALL=NOPASSWD:  ALL

/etc/sudoers文件中。它允许sudo组的任何成员使用sudo而无需输入任何密码。

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

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

答案 1 :(得分:0)

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

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