为什么cron在我的脚本中默默地无法运行sudo东西?


29

我有一个从非特权用户的crontab运行的脚本,该脚本使用调用了一些命令sudo。除非不是。脚本运行正常,但sudo'ed命令无提示地失败。

  • 该脚本可以作为相关用户从shell完美运行。

  • Sudo不需要密码。有问题的用户已在中(root) NOPASSWD: ALL授予访问权限/etc/sudoers

  • Cron正在运行并执行脚本。添加简单的代码date > /tmp/log会在适当的时间产生输出。

  • 这不是权限问题。同样,脚本确实得到执行,但不是sudo'ed命令。

  • 这不是路径问题。运行env从脚本内被运行显示正确的$PATH变量,包括路径须藤。使用完整路径运行它没有帮助。正在执行的命令被赋予完整路径名。

  • 尝试捕获包括STDERR的sudo命令的输出不会显示任何有用的信息。添加sudo echo test 2>&1 > /tmp/log到脚本会生成空白日志。

  • sudo二进制文件本身可以很好地执行并识别它具有权限,即使从脚本内的cron运行时也是如此。添加sudo -l > /tmp/log到脚本将产生输出:

    用户ec2-user可以在此主机上运行以下命令:
    (root)NOPASSWD:ALL

使用show检查命令的退出代码$?正在返回错误(退出代码:)1,但似乎没有错误产生。简单的命令/usr/bin/sudo /bin/echo test将返回相同的错误代码。

还有什么可能发生?

这是最近创建的运行最新Amazon Linux AMI的虚拟机。crontab属于用户ec2-user,而sudoers文件是默认的发行版。


1
我本来要讨论一种解决方案,但是后来我读了一下The user in question has (root) NOPASSWD: ALL access granted in /etc/sudoers,我的大脑开始大声尖叫,无法继续阅读。
Shadur 2012年

@Shadur:与手交谈。这也不是我设置机器的方法,但是这些机器开箱即用。即使通过您的机器,您也不会获得root密码,而作为盒子所有者的密钥将进入ec2用户帐户,该帐户具有(如上所述)完全sudo访问权限。除非您设置ec2-user的密码,否则您都不会得到密码,这是仅密钥登录。
Caleb 2012年

1
然后,我建议您做的第一件事是sudo为脚本中所需的命令设置一个具有受限权限/ only / 的单独用户,并完全禁用其登录功能。
Shadur 2012年

如果您具有root用户,并且希望cron作业以root用户身份运行,那么为什么将其放在ec2-user的crontab中?root的crontab会更合适吗?还是/ etc / crontab?
cas 2012年

@CraigSanders:我不希望cron作业以root身份运行,实际上,大多数应以用户身份运行。问题不在于以root身份运行作业,而是关于脚本可以通过sudo特别访问一个功能。
Caleb 2012年

Answers:


39

Sudo的权限文件中有一些特殊选项,其中之一允许对在TTY内运行的shell的使用情况进行限制,而cron则不是。

默认情况下,包括Amazon Linux AMI在内的某些发行版已启用此功能。该/etc/sudoers文件将如下所示:

# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
#         You have to run "ssh -t hostname sudo <cmd>".
#
Defaults    requiretty

#
# Refuse to run if unable to disable echo on the tty. This setting should also be
# changed in order to be able to use sudo without a tty. See requiretty above.
#
Defaults   !visiblepw

如果您是在shell脚本而不是sudo命令本身的级别上将输出捕获到STDERR的,那么您似乎会看到类似以下的消息:

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

解决方案是通过删除或注释掉以下选项,允许sudo在非TTY环境中执行:

#Defaults    requiretty
#Defaults   !visiblepw

我可以确认CentOS确实有这些限制。
aeu
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.