如果你经常使用命令行,sudo 是你经常会用到的命令之一。默认情况下,sudo 会提示输入密码,然后在短时间内缓存凭据。这是最安全的行为,但在某些情况下,比如运行自动化脚本或 CI 流水线时,你可能需要跳过密码提示。

本指南将说明如何配置 sudoers 文件,以便特定用户或组可以在不被要求输入密码的情况下运行 sudo 命令。

警告授予无密码 sudo 权限,尤其是使用 NOPASSWD:ALL 时,会移除一道关键的安全防线。任何获得该用户账户访问权限的人都可以在无需验证的情况下以 root 身份运行任何命令。尽可能将无密码规则限制在确实需要的具体命令上。

将用户添加到 sudoers 文件

sudoers 文件包含决定用户和组 sudo 权限的信息。

你可以通过修改 sudoers 文件,或在 /etc/sudoers.d 目录中添加配置文件来配置用户的 sudo 访问权限。该目录内创建的文件会自动包含在 sudoers 文件中。

在进行任何修改之前,最好先备份当前文件:

终端

sudo cp /etc/sudoers{,.backup_$(date +%Y%m%d)}

信息date 命令会将当前日期附加到备份文件名中。

使用 visudo 命令打开 /etc/sudoers 文件:

终端

sudo visudo

编辑 sudoers 文件时,请始终使用 visudo。该命令会在编辑后检查语法,如果出错则不会保存更改。使用普通文本编辑器打开文件可能会导致语法错误,使你完全无法使用 sudo。

在 Debian 和 Ubuntu 上,visudo 会在 GNU nano 中打开文件,因为 sudo 包调用 /usr/bin/editor,而 alternatives 系统将该名称指向 nano。在其他大多数发行版中,它会打开 vim。要在 Debian 或 Ubuntu 上选择不同的编辑器,请重新配置 alternative:

终端

sudo update-alternatives --config editor

在 sudo 命令行上设置变量在这里不起作用。默认的 env_reset 策略会阻止它,因此 sudo EDITOR=nano visudo 会被拒绝并显示 抱歉,不允许设置以下环境变量:EDITOR。在 root shell 中,EDITOR=nano visudo 则可以正常工作。

滚动到文件末尾并添加以下行。这将允许用户 ggdoc 使用 sudo 运行任何命令而无需输入密码:

/etc/sudoersini

ggdoc  ALL=(ALL) NOPASSWD:ALL

信息不要忘记将 ggdoc 替换为你想要授予访问权限的用户名。

如果你想允许用户仅运行特定命令而无需密码,请在 NOPASSWD 关键字后列出这些命令。

例如,仅允许 mkdir 和 mv 命令:

/etc/sudoersini

ggdoc ALL=(ALL) NOPASSWD:/usr/bin/mkdir,/usr/bin/mv

你可以使用 which 查找命令的完整路径,例如 which mkdir。

要将相同规则应用于整个组,请在组名前加上 % 前缀。以下行授予 deploy 组中每个成员无密码 sudo 权限:

/etc/sudoersini

%deploy ALL=(ALL) NOPASSWD:ALL

完成后,保存文件并退出编辑器。

使用 /etc/sudoers.d

与其直接编辑 sudoers 文件,你可以在 /etc/sudoers.d 目录中创建一个包含授权规则的新文件。这种方法使管理 sudo 权限更加容易,尤其是在有很多用户或使用自动化配置工具时。

使用 visudo 创建文件,以便仍然应用语法检查:

终端

sudo visudo -f /etc/sudoers.d/ggdoc

你可以随意命名该文件,但最好使用用户名或组名作为文件名。

添加与在 sudoers 文件中相同的规则:

ggdoc  ALL=(ALL) NOPASSWD:ALL

保存文件并关闭编辑器。确保文件归 root 所有且具有正确的权限;sudo 可能会忽略其他人可写的文件:

终端

sudo chown root:root /etc/sudoers.d/ggdoc
sudo chmod 0440 /etc/sudoers.d/ggdoc

验证配置

添加规则后,以目标用户身份运行 sudo -l 来验证规则是否生效:

终端

sudo -l

在输出中查找包含 NOPASSWD 的行。如果出现,则说明配置生效。你也可以通过使用 sudo 运行命令来测试;它应该不再要求输入密码。

故障排除

sudo 仍然提示输入密码
检查 /etc/sudoers.d/ 中的文件权限。文件必须归 root 所有,且不能是全局可写的。运行 sudo chmod 0440 /etc/sudoers.d/filename 进行修复。另外,确保规则中的用户名和主机名完全匹配。

语法错误导致 sudo 无法使用
如果你使用了 visudo,它会拒绝保存有问题的文件。如果你使用普通编辑器编辑了文件并失去了 sudo 访问权限,请进入恢复模式或使用 root shell 修复 /etc/sudoers。这就是为什么始终应使用 visudo 的原因。

规则在 /etc/sudoers.d/ 中被忽略
/etc/sudoers.d/ 中的文件名不能包含点(.)或以波浪号(~)结尾。这些文件会被静默跳过。请重命名文件以去掉点或波浪号。