可以做哪些事情来使包含 sudo 命令并使用计时器计划“crontab”运行的 Bash 脚本正常工作?

可以做哪些事情来使包含 sudo 命令并使用计时器计划“crontab”运行的 Bash 脚本正常工作?

我尝试运行一个我命名的脚本script1.sh

out="/home/me/scripts/out.txt"
sudo ntpdate 99.99.99.99 >> $out

在带有 crontab 的计时器上森托斯7操作系统。这样做的目的是自动将 Centos 7 时间与时间服务器同步。

使用命令

crontab –e             # (1)
sudo crontab –e        # (2)
sudo vi /etc/crontab   # (3),

我在每个配置文件 (1)、(2) 和 (3) 中粘贴了时间表定义的字符串。该字符串是

* */1 * * *   me   /home/me/scripts/script1.sh

然后我应用该sudo systemctl reload crond.service命令来实施新配置。

根据上述时间表,script1.sh必须每隔一小时执行一次。然而,问题是 ntpdate 需要sudo权限,因此它script1.sh会做同样的事情。谷歌搜索这个问题,我发现可以通过使用开始编辑命令sudo编辑配置文件来取消密码要求。然后我在其底部添加了一些无密码访问的权限:sudoersudo visudo

me   ALL=(ALL)   NOPASSWD:   /home/me/scripts/*
me   ALL=(ALL)   NOPASSWD:   /usr/sbin/ntpdate

起初,当它在所有三个 (1)、(2) 和 (3) 中定义时,它就可以工作。然后,由于我在 (2) 和 (3) 中评论了计划定义,并重新加载了 crontab - 它会停止工作并开始询问 sudo 密码。然后我原样退回去,但没有看到任何效果。

问题

你能提示一下该怎么做吗?可以做些什么来让它发挥作用?

答案1

您应该使用系统 crontab,而不是尝试通过用户的 crontab 触发需要 root 的操作,然后您就不会需要 sudo,因为事情是已经以 root 身份运行。

但在这个具体案例中,从技术上来说,你确实做错了事情。ntpdate不应该这样使用;这只是时间突然跳跃和时钟不断漂移的保证。

因此,废弃该脚本并安装chrony,并适当地配置 /etc/chrony.conf,并启用它:sudo systemctl enable --now chronyd。 Chrony 正是您希望以最小错误保持时钟与 NTP 服务器同步的守护进程。

相关内容