定时任务脚本权限,不允许普通用户修改root定时脚本
普通用户能修改 root 的定时任务脚本,本质是 crontab 文件或脚本文件权限设置不当。
要解决这个问题,需要同时控制文件系统权限和 crontab 命令的使用范围。
本文用可执行的命令步骤,演示如何彻底禁止普通用户改动 root 的定时脚本。
先确认现状:普通用户能碰哪些文件
先登录服务器,查看当前 root 定时任务文件和对应脚本的权限。
root 的 crontab 文件通常位于 /var/spool/cron/root,定时任务里引用的脚本一般在 /root 或其他自定义目录。
执行下面命令:
ls -l /var/spool/cron/root
ls -l /root/*.sh
如果输出显示这些文件的属组是 root 且权限为 644,说明其他用户拥有读取权限;
如果权限是 666 或 777,其他用户就能直接修改。
这就是普通用户能改动 root 定时脚本的根本原因。
第一步:修改文件属主和权限,锁死脚本
先把所有涉及定时任务的脚本统一收束到 root 专属目录,并修改属主和权限。
mkdir -p /root/cron-scripts
chown root:root /root/cron-scripts
chmod 700 /root/cron-scripts
将脚本文件移动到该目录后,执行:
chown root:root /root/cron-scripts/*.sh
chmod 700 /root/cron-scripts/*.sh
同时修改 root 的 crontab 文件权限,只允许 root 读写:
chown root:root /var/spool/cron/root
chmod 600 /var/spool/cron/root
这样普通用户既无法进入目录,也无法读取或编辑脚本内容。
第二步:通过 /etc/cron.allow 限制 crontab 命令
仅靠文件权限还不够,普通用户仍可能通过 crontab 命令创建自己的任务,甚至尝试覆盖 root 的定时配置。
Linux 提供了 /etc/cron.allow 和 /etc/cron.deny 两个控制文件。
先创建 /etc/cron.allow:
touch /etc/cron.allow
chmod 600 /etc/cron.allow
然后编辑该文件,只保留允许使用 crontab 的用户名,一个用户一行:
root
保存后,普通用户执行 crontab -e 时会提示没有权限使用该命令,也就无法提交新的定时任务。
第三步:修改后如何验证是否生效
切换到一个普通用户测试:
su - testuser
crontab -e
crontab -l
预期结果是系统直接拒绝,并返回类似 You (testuser) are not allowed to use this program (crontab) 的错误。
再检查 root 的定时任务是否仍在正常执行:
crontab -l
如果 root 能正常读取自己的任务,说明上述权限改动没有破坏现有定时任务。
常见疑问和避坑提醒
为什么改了脚本权限,普通用户还是能看到执行内容?
只修改脚本所在目录权限,但没有修改 crontab 文件本身的读权限。一定要同时把 /var/spool/cron/root 的权限调整为 600。
普通用户还能通过 sudo 或其他运维平台绕过吗?
能。如果普通用户有 sudo 权限,或者服务器接入了第三方运维平台,绕过方式会变多。生产环境建议同时限制 sudo 规则,并关闭不必要的登录账号。
修改 crontab 权限会不会影响其他服务?
如果服务器上还有其它应用需要读取 root 的定时任务,修改后可能受挫。先用 crontab -l 确认当前任务内容,再对照 /etc/cron.allow 逐一放行真正需要的用户。
完成上述三个步骤后,普通用户既无法直接读取和修改 root 的定时脚本,也无法用自己的账号创建定时任务。
建议把 cron.allow 的变更和脚本目录的权限检查纳入日常服务器巡检清单。
如果你正在处理 392.定时任务脚本权限,不允许普通用户修改root定时脚本,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。