这是我的简单 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