<p>sudo -l 是查看当前用户被授予哪些合法 sudo 权限的最标准、最可靠方式,它仅展示 /etc/sudoers 及 /etc/sudoers.d/ 中显式授权、主机名匹配、且符合执行身份与参数限制的命令条目,不反映隐式权限或组继承,需结合 -- 验证实际可执行性并排查 requiretty、通配符静态匹配等干扰因素。</p>

直接运行 sudo -l 是查看当前用户被授予哪些合法 sudo 权限的最标准、最可靠方式。
sudo -l 输出说明什么
它只展示 /etc/sudoers 及 /etc/sudoers.d/ 下所有文件中,显式授权给当前用户(或其所属组)且主机名匹配 的命令条目。不是“有没有权限”,而是“具体能跑哪些命令、以谁的身份、带什么限制”。
- 输出类似
(root) /usr/bin/systemctl:表示可使用 root 身份执行 systemctl - 出现
NOPASSWD::说明该条目下免密(但不等于所有命令都免密) - 含
NOEXEC或SETENV:代表有额外安全约束,不能忽略 - 若显示
User xxx is not allowed to run sudo on hostname:说明该用户在 sudoers 中完全无显式配置,哪怕属于 sudo 组,只要那行%sudo被注释或删了,就报这个错
为什么有时 sudo -l 看不到本该有的权限
常见原因不是配置错了,而是匹配条件没满足:
-
主机名不匹配:sudoers 中用了 Host_Alias(如
PROD = web01, db02),而hostname返回的是web01.local,导致规则失效 -
requiretty 等策略拦截:输出为空但无报错?很可能是被
Defaults requiretty拦住,此时需配合sudo -v -U $USER验证是否能通过身份校验 -
通配符是静态的:比如
/var/log/*.log不代表你能跑tail /var/log/nginx/error.log,只是允许字面路径匹配/var/log/*.log—— 实际执行必须严格符合
怎么验证某条命令真能跑
光看 sudo -l 列出的命令不够,得测带参数的完整调用:
- 用
sudo -l -- /path/to/cmd arg1 arg2:双横线后接真实命令,模拟 sudo 内部匹配逻辑 - 路径必须完全一致:
/bin/ls≠ls,/usr/bin/python3≠python3 - 参数顺序、个数、是否含空格或通配符,全部参与精确比对
脚本里静默判断权限别用 sudo -l
自动化场景下,sudo -l 不适合判断权限通路:
- 会输出敏感路径,可能被审计系统拦截
- 可能卡在密码提示(即使你不想输)
- 真正推荐的是:
sudo -n true - 返回码为 0 → 有权限(且免密或缓存有效);返回码为 1 → 无权限,或需密码但
-n拒绝交互


















