linux - 为什么我在 bash 中的 sudo 命令不能通过 crontab 执行?

标签 linux bash crontab sudo

这是我的简单 runme.sh:

#!/bin/bash

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

其中,'CbEYKFKt'为当前用户samX的密码,拥有root权限(已附加"samX ALL=(ALL:ALL) ALL"visudo 中)。我打算在 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 移到末尾后打印错误:

sudo:抱歉,您必须有 tty 才能运行 sudo

谁知道这是什么意思?

最佳答案

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

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

例如,你可以有这样一行

%sudo   ALL=NOPASSWD:  ALL

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

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

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

关于linux - 为什么我在 bash 中的 sudo 命令不能通过 crontab 执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29939840/

相关文章:

java - bash 脚本问题启动程序

linux - 查找字符串中三个字符序列的频率

regex - 如何使用 sed 提取复杂的版本号?

python - 与 docopt 的 Cronjob

ubuntu - Laravel 5 中的调度程序在我的本地系统中使用 crontab 不工作

linux - 查找具有特定名称且没有指向它们的符号链接(symbolic link)的文件夹

c++ - 在 C++ 中计算字符串的 MD5

python - 当在 bash 中调用的 python 脚本遇到错误时,如何停止 bash 脚本?

java - 如何使用命令行在 Windows 上查找 JRE 路径

node.js - 从特定时间开始每小时的 cron 表达式