为什么我的sudo命令在bash中不能通过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文件。 我的代码有什么问题吗? 提前致谢。

PS在将2>&1移动到末尾之后打印一个错误:

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

有谁知道这是什么意思?

sudo这样的认证工具通常从控制终端读取密码(例如,通过/dev/tty ,参见tty(4) ),而不是从标准输入。 (但是你可以通过-Ssudo让它读取stdin上的密码)

您可以使用expect (可以处理终端),但是您可以简单地配置/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