如何使用sudo命令运行cron作业

有没有可能运行一个需要使用cron命令的sudo任务?

比如:

 sudo rm somefile

欢迎,Sayem Siam。请查看这个问题的答案:http://askubuntu.com/questions/2368/how-do-i-setup-cron-job。我认为你的问题在AU上已经有人问过了。 - stephenmyall
1我正在尝试执行需要密码的sudo命令,但是如何从cron文件中提供密码呢? - sayem siam
3@sayemsiam 你不需要使用sudo,只需编辑root的crontab即可。 - Braiam
请参见此答案 - user13975
5个回答

我不会深入讨论这是一个多么糟糕的想法;简单来说,在 crontab 中运行 sudo 需要将您的密码以明文形式存储在某个地方。 这是一个糟糕的想法。
以下是通过cron运行管理任务的首选方法。如果您正在修改root的crontab,实际上不需要在crontab中编写sudo。
使用root的crontab
运行以下命令:
sudo crontab -e

这将打开“root”的定时任务表。在此上下文中,不需要使用“sudo”来运行命令,因为它会作为“root”调用。 因此,您只需将以下内容追加到root的定时任务表即可。
@hourly rm somefile

如果您绝对想要不安全并冒险使用密码,以下将在您自己的计划任务表中运行您的命令,并在sudo提示输入密码时自动输入。

再次强调,不建议这样做


在您自己的crontab中,将您的命令写成这样:
@hourly echo "password" | sudo -S rm somefile

明显的缺点是,如果有人能够访问您的crontab,您的密码将以明文形式可读。 您不应该这样做。

2好用就好!只是要小心不要留下任何安全漏洞,否则它们可能会在以后回来困扰你。 - SirCharlo
2@SirCharlo 为什么要使用root用户的crontab而不是系统范围的crontab /etc/crontab - Eliah Kagan
2@Elijah 为什么不呢? - SirCharlo
4这个答案没有达到要求,因为它忽略了你的sudoers文件中可用的细微差别,比如不需要密码的sudo组。 - brent
非常非常有用的观点,感谢您的大力帮助。 - Nasser Mansouri
Root的crontab是最好的解决方案,它专门用于需要sudo权限的命令,所以我不明白为什么你会想要将密码以明文形式放在其中。 - Lorenzo
你不应该这样做。每个人都在寻找这个AskUbuntu帖子,以了解如何做到这一点。 - J. Spark

如果您将脚本放在cron目录之一(/etc/cron.*)中,那么您不需要使用sudo,因为它是以root身份运行的。
如果您正在使用crontab,则应该使用root的crontab。这将以root身份运行,并且不需要sudo。
sudo crontab -e

1我也会将命令放在 /etc/cron.hourly/something 目录中。这就是这些目录的用途。 - John S Gruber
4不会。你可以将其放置在 /etc/cron.SOMETHING/SCRIPT 中,但我不建议同时使用两者。两者大致具有相同的功能,尽管使用 crontab 可以更加灵活地控制任务运行的频率和时间。 - tgm4883
2我应该明确表示,我是指这作为一种替代方案。谢谢。 - John S Gruber

在终端中运行以下命令
sudo visudo

在文件末尾添加了以下行:
vidyadhar  ALL= NOPASSWD: /bin/rm

在上面的例子中,vidyadhar是用户名,如果您通过vidyadhar运行rm命令,它将不会要求输入密码。

25嗯...那么,任何恶意命令,比如 sudo rm -rf 'slash'不要运行该命令),如果从该用户执行,将不需要密码.. 我不知道,感觉不安全,对吧? - SirCharlo
是的,我知道。你的方法很好。但是我正在使用上述方法为其他用户授予停止/启动某些服务的权限。 - Vidyadhar
34这是一个非常糟糕的主意。请不要这样做。 - bkanuka
4也许vidyadhar ALL= NOPASSWD: /bin/rm somefile会更安全一些。 - Wernfried Domscheit
2这是一个糟糕的主意。你给了rm命令全局的sudo权限。相反,应该给一个脚本授予sudo权限,包括rm或其他命令在内,并将其设置为可执行,然后再给予sudo权限。<username> ALL=(ALL) NOPASSWD: /home/<username>/bin/<script>,这样会更安全。 - R J
2这并不是一个"极其糟糕的想法",请停止使用无用的夸张言辞。显然,给予用户与root相同的权限将使其变得和root一样危险。对于专门用于备份的用户或其他用户账户来说,这是非常合适的,因为它们的访问权限与root一样受到严格控制。 - user630247

有时候,root需要以系统中的特定用户身份执行命令。例如,使用borgbackup时,通常会让root以borg用户的身份检查仓库。 如果任务需要每天执行一次,我们将使用/etc/cron.daily文件夹,就像这样:
# cat /etc/cron.daily/borgbackup_check

#!/bin/bash
sudo -u borg borg check /borgbackup >> /var/log/borgbackup.log

在使用"-u borg"时,将以borg用户的身份执行操作,"borg"是borg命令,"/borgbackup"是存储库。

没有人提到带有setuid位的可执行脚本吗?我可以理解这可能是一个安全漏洞,太危险了(在这个抽屉里有锋利的刀子,保持权限严格),但感觉比在根crontab中工作要安全一些。例如,即使我不在场,我也想每晚或每周进行碎片整理/ fstrim。
另一种选择是让一个脚本在循环中运行,睡眠直到合适的时间,然后使用sudo启动它。