Linux的at命令权限控制仅支持显式用户名列表,不支持按组配置;必须创建/etc/at.allow并逐行列出授权用户(如root、alice等),文件权限设为600,否则策略无效。

直接创建 /etc/at.allow 并只写入管理组成员
Linux 的 at 命令权限控制不支持“按组”直接配置,必须显式列出用户名。系统只认文件里的具体用户名,不会自动解析组成员关系。所以不能写 admin 或 %wheel 这类组名进去——那样会当成普通用户名,导致权限失效。
正确做法是:手动把管理组(比如 sysadmin)下的所有当前有效用户,逐行写入 /etc/at.allow。例如:
root alice bob charlie
注意:/etc/at.allow 文件必须存在且仅 root 可读写(chmod 600 /etc/at.allow),否则策略不生效。
为什么不能依赖 /etc/at.deny 配合组管理
/etc/at.deny 是黑名单机制,适合“默认放行、个别禁用”的场景;而你要的是“默认禁止、仅限特定人”,它无法满足。即使你把非管理组用户全加进 /etc/at.deny,也会面临两个问题:
- 新用户加入系统后,如果不及时同步到
/etc/at.deny,就自动获得at权限 - 无法自动同步组变更(比如用户被加入
sysadmin组,但没手动加进/etc/at.allow,仍无权使用)
更关键的是:/etc/at.deny 对 root 永远无效,但你无法靠它赋予其他用户权限——它只做“拒绝”,不做“允许”。
如何自动化维护 /etc/at.allow 中的用户列表
如果管理组成员经常变动,手动维护 /etc/at.allow 容易出错或滞后。可以用脚本定期生成:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
例如,假设管理组是 sysadmin,运行以下命令可刷新文件:
getent group sysadmin | cut -d: -f4 | tr ',' '\n' | sort -u | sudo tee /etc/at.allow
再补上 root(因为 getent group 不一定包含 root):
echo "root" | sudo tee -a /etc/at.allow
执行完记得设权限:sudo chmod 600 /etc/at.allow。建议把这个逻辑封装成 cron 脚本(由 root 运行),每小时检查一次。
验证是否生效及常见失效点
修改后无需重启 atd 服务,策略立即生效。但容易忽略的点有:
- 用户已提交的
at任务仍会执行,需用atq -u username+atrm job_id清理 - 若
/etc/at.allow存在但为空,所有非 root 用户都无法使用at(包括你刚加进管理组的人) - 用户登录 shell 启动时可能已缓存旧的权限状态,建议让其重新登录或新开 shell 测试
- 某些发行版(如 RHEL/CentOS 8+)默认不带
/etc/at.allow,必须手动创建,不能只改/etc/at.deny
最简验证方式:切换到目标用户,执行 at now + 1 minute,输入 date 后 Ctrl+D;若提示 you are not authorized to use at,说明限制成功。










