必须用sudo visudo -f /etc/sudoers.d/创建以.conf结尾的独立配置文件,设权限0440,仅授权绝对路径命令并用sudo -n验证;直接改/etc/sudoers易致sudo瘫痪。

为自动化脚本配置免密运行的特定 sudo 权限,核心是让脚本在无交互终端(如 cron、systemd、CI 流水线)中能静默执行关键命令,同时不开放多余权限。关键不在“关掉密码”,而在“精准授权”。
必须用 /etc/sudoers.d/ 下的独立 .conf 文件
直接改 /etc/sudoers 风险极高——语法错一个空格,sudo 就瘫痪,连 root 都无法修复。正确做法是:
- 用 sudo visudo -f /etc/sudoers.d/your-script-nopasswd 创建并编辑文件(不能用 vim 直接写,visudo 会校验语法)
- 文件名必须以 .conf 结尾,且不能含点(.)或下划线(_),例如 deploy-nopasswd.conf 合法,deploy_v1.conf 会被系统忽略
- 保存后立即执行 sudo chmod 0440 /etc/sudoers.d/your-script-nopasswd,权限不是 0440,sudo 拒绝加载
只授权绝对路径的无参命令
脚本调用 sudo 时,命令必须与 sudoers 规则**逐字完全匹配**。带参数、通配符、shell 调用都不可靠且危险:
- ✅ 正确:deploy ALL=(root) NOPASSWD: /opt/scripts/backup.sh(脚本由 root 所有、权限 0755)
- ❌ 错误:deploy ALL=(root) NOPASSWD: /opt/scripts/backup.sh --force(参数可能被绕过;sudo 只做前缀匹配)
- ❌ 危险:deploy ALL=(root) NOPASSWD: /usr/bin/bash(等于开放任意命令)
- ⚠️ 注意:所有路径必须用 which 确认,比如 systemctl 通常是 /usr/bin/systemctl,不是 /bin/systemctl
验证是否真正生效(别靠“试一下”)
手动执行脚本成功 ≠ 免密规则生效。cron 或 systemd 下无终端,必须用无交互方式验证:
- 先切到目标用户:su - deploy
- 清空缓存:sudo -k
- 强制无交互测试:sudo -n /opt/scripts/backup.sh —— 成功则静默返回;失败立刻报 sudo: a password is required
- 查授权清单:sudo -l -U deploy —— 输出里必须明确列出你写的那条完整路径,否则说明文件未加载或规则不匹配
脚本自身也要加固
免密只是第一层,脚本本身是第二道防线:
- 脚本文件归 root:root 所有,权限设为 0755,禁止普通用户修改
- 若脚本需读取配置(如数据库密码),配置文件也应为 root:root,权限 ≤ 0600
- 脚本内部不做参数解析或 shell 调用(如 eval、$()),所有环境逻辑通过配置文件或环境变量控制











