命令是干什么的
at 与 batch 的提交权限由 /etc/at.allow 和 /etc/at.deny 两个名单文件控制,机制与 cron 的 cron.allow、cron.deny 完全一致。atd 在收到提交请求时读取这两个文件判断用户能不能用,因此改完文件立即生效,不需要重启服务。判断顺序是固定的:先看 at.allow,存在就只认它;不存在才看 at.deny;两个文件都没有时按发行版编译时的默认行为,通常是只有 root 能用。
基本信息
| 适用平台 | Linux,属于 at 软件包,依赖 atd 守护进程 |
|---|---|
| 涉及文件 | /etc/at.allow 与 /etc/at.deny,每行写一个用户名 |
| 判断顺序 | at.allow 存在则只用它,at.deny 被忽略;否则才看 at.deny |
| 生效方式 | 提交任务时即时读取,改完即生效,无需重启 atd |
| 文件属性 | root 所有、普通可读权限即可,不要放开组与其他用户的写权限 |
| 易混淆项 | cron 用的是 /etc/cron.allow 与 /etc/cron.deny,规则相同但文件不同 |
典型使用场景
- 安全加固基线:只允许固定的运维与部署账号提交延时任务,其他账号一律禁止
- 排查用户反馈不能用 at:先区分是名单拦截、软件包缺失还是 atd 未运行
- 交付环境权限收敛:把自动化账号加进名单,避免上线后任务提交被拒
- 多机配置统一:发现各机器策略不一致时收敛到同一份名单
- 定期审计:确认没有来历不明的账号获得提交权限
- 应急封禁:账号行为异常时把它从名单移除,立即生效不用等重启
配置示例
配置示例
cat /etc/at.allow /etc/at.deny 2>/dev/null # 先看现状,可能只有一个文件存在
sudo tee /etc/at.allow > /dev/null <<'EOF'
root
deploy
EOF
sudo chown root:root /etc/at.allow # 属主必须是 root
sudo chmod 0644 /etc/at.allow # 只读即可,别给组和其他用户写权限
sudo ls -l /etc/at.allow /etc/at.deny # 复核权限与存在情况
sudo su - deploy -c 'echo date | at now + 1 hour' # 用名单内账号实测能提交
sudo su - guest -c 'echo date | at now + 1 hour' # 名单外账号应被拒绝两个名单的判定矩阵
| at.allow | at.deny | 结果 |
|---|---|---|
| 存在 | 无论是否存在 | 只有 allow 中列出的用户能提交任务,deny 完全被忽略 |
| 不存在 | 存在 | deny 中列出的用户被禁止,其余用户都能提交 |
| 不存在 | 不存在 | 按发行版默认行为,通常只有 root 能用 |
| 存在但没写 root | 无影响 | root 也会被拒之门外,写名单时务必包含 root |
at.allow 存在时 at.deny 形同不存在,这是最容易误解的一点:以为把用户加进 deny 就封住了,实际因为 allow 先匹配而毫无作用。两个文件必须按同一套策略来设计。
最小化镜像与容器基础镜像里常常没有安装 at,用户报不能用 at 时先确认软件包与 atd 服务状态,不要一上来就翻名单文件。
cron 用的是 cron.allow 与 cron.deny,规则一样但文件独立。要求某个用户既不能用 at 也不能用 cron,两套文件都要处理。