【问题标题】:Why my sudo command in bash cannot be executed via crontab?为什么我在 bash 中的 sudo 命令无法通过 crontab 执行?
【发布时间】:2015-04-29 09:38:52
【问题描述】:

这是我的简单 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 移到末尾后打印错误:

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

有人知道这是什么意思吗?

【问题讨论】:

  • 顺序很重要:试试58 16 * * * /bin/bash /home/data/samX/runme.sh > /home/data/samX/log_cron 2>&1
  • 正如我在您的other question 中告诉您的,您应该修复您的 sudoers,但这仅适用于想要复制已保存密码的其他读者。
  • 为什么顺序很重要?相关官方解释的链接表示赞赏:] @martin
  • 我只是在测试这个场景,一旦解决了,我会在 visudo 中添加 NOPASSWORD。感谢再次提及! @马丁
  • 为什么不用root的contab?

标签: linux bash crontab sudo


【解决方案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 可执行文件)。

【讨论】:

    【解决方案2】:

    不用把所有命令放在一行,你可以正常写代码,分成几行:

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

    【讨论】:

    • 是的,第一个是从echo中取密码,第二个是EOF,注意:-S-s是不同的
    • 我已经编辑了我的答案,前一个是错误的。这个可以工作.. @BasileStarynkevitch
    • 抱歉,关于tty 的最新错误已在我的问题中更新,它无法幸免。请看一下,谢谢。
    • "这可能是因为您的/etc/sudoers 文件(或它包含的任何文件)具有:Defaults requiretty"来自:unix.stackexchange.com/questions/122616/…
    猜你喜欢
    • 2020-11-07
    • 2011-09-15
    • 1970-01-01
    • 2015-06-28
    • 1970-01-01
    • 1970-01-01
    • 2019-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多