sudo -l 最可靠,因它直接读取 /etc/sudoers 及 /etc/sudoers.d/ 下所有配置,严格按主机名、用户、目标用户、命令路径及参数逐条匹配并输出真实生效的授权命令,不依赖组成员关系的表面判断。

直接运行 sudo -l 即可查看当前用户被明确授权的 sudo 命令清单。
为什么这条命令最可靠
sudo -l 会读取 /etc/sudoers 和 /etc/sudoers.d/ 下所有有效配置,按当前主机名、用户身份、目标用户、命令路径及参数约束,逐条匹配并输出允许执行的操作。它不依赖组成员关系的“表面判断”,只反映真实生效的规则。
- 输出以 (root) /usr/bin/systemctl 这类格式显示,括号内是目标用户,后面是完整命令路径
- 若含 NOPASSWD: 标签,表示该命令可免密执行
- 若含 (%wheel) 或 (%sudo),说明权限通过组继承,但前提是该组在 sudoers 中有对应未注释的授权行
常见输出含义速查
输出为空但无报错:用户有基础 sudo 权限,但可能被 Defaults 策略拦截(如 requiretty 要求 TTY、!visiblepw 禁止密码回显),需配合 sudo -v 测试是否能通过身份校验。
输出 “User xxx is not allowed to run sudo on hostname”:该用户在 /etc/sudoers 及其包含文件中**没有任何显式授权条目**——不是权限被禁,而是压根没配。即使用户属于 sudo 组,只要 %sudo 行被注释或删除,也会报此错。
验证某条具体命令能否真正执行
sudo -l 列出的命令不等于“能直接敲出来就跑通”。例如显示 (root) /usr/bin/tail /var/log/*.log,你执行 sudo tail /var/log/nginx/error.log 仍会被拒绝——因为 * 是 sudoers 中的静态通配符,只匹配字面路径 /var/log/*.log,不参与 shell 展开。
- 要精准测试,用 sudo -l -- /path/to/cmd arg1 arg2(双横线后接完整调用)
- 确保命令路径完全一致(/bin/ls ≠ ls)、参数顺序和个数也必须严格匹配
注意主机名匹配问题
sudo -l 默认按 hostname 输出匹配 sudoers 中的 Host_Alias。如果配置了 Host_Alias PROD = web01, db02,但实际运行 hostname 返回的是 web01.local,那 PROD 下的规则就不会生效。
- 用 hostname -f 查看完整 FQDN,确认是否与 sudoers 中定义的主机别名一致
- 临时绕过可加 -H -h web01(需你已有对应权限)


















