
如果你经常在命令行上工作,sudo 是你经常会用到的命令之一。默认情况下,sudo 会提示输入密码,并在短时间内缓存你的凭据。这是最安全的做法,但在某些情况下(例如运行自动化脚本或 CI 流水线),你可能需要跳过密码提示。
本指南讲解如何配置 sudoers 文件,使特定用户或组能够运行 sudo 命令而无需输入密码。
将用户添加到 sudoers 文件
sudoers 文件包含决定用户和组 sudo 权限的信息。
你可以通过修改 sudoers 文件,或向 /etc/sudoers.d 目录添加配置文件来配置用户的 sudo 访问权限。在该目录内创建的文件会被自动包含进 sudoers 文件。
在进行任何修改之前,最好先备份当前文件:
sudo cp /etc/sudoers
{
,.backup_
$(
date +%Y%m%d
)
}
使用 visudo 命令打开 /etc/sudoers 文件:
sudo visudo
编辑 sudoers 文件时务必使用 visudo。该命令会在编辑后检查语法,若有错误则不会保存更改。用普通文本编辑器打开文件存在语法错误风险,可能让你彻底失去 sudo 权限。
在 Debian 和 Ubuntu 上,visudo 会在 GNU nano 中打开文件,因为 sudo 软件包调用 /usr/bin/editor,而 alternatives 系统将该名称指向 nano。在大多数其他发行版上它会打开 vim。若要在 Debian 或 Ubuntu 上选择其他编辑器,重新配置 alternatives:
sudo update-alternatives --config editor
在 sudo 命令行上设置该变量在这里不起作用。默认的 env_reset 策略会阻止它,因此 sudo EDITOR=nano visudo 会拒绝,提示 sorry, you are not allowed to set the following environment variables: EDITOR。而在 root shell 中,EDITOR=nano visudo 是可以工作的。
滚动到文件末尾并添加以下行。这将允许用户 linuxize 免密码提示运行任何 sudo 命令:
linuxize ALL
=
(ALL) NOPASSWD:ALL
如果你只想允许用户免密码运行特定命令,请在 NOPASSWD 关键字后列出它们。
例如,仅允许 mkdir 和 mv 命令:
linuxize ALL
=
(ALL) NOPASSWD:/usr/bin/mkdir,/usr/bin/mv
你可以用 which 命令查找命令的完整路径,例如 which mkdir。
要将同样的规则应用到整个组,请在组名前加上 %。下面这一行授予 deploy 组每个成员免密码 sudo:
%deploy ALL
=
(ALL) NOPASSWD:ALL
完成后,保存文件并退出编辑器。
使用 /etc/sudoers.d
除了直接编辑 sudoers 文件,你还可以在 /etc/sudoers.d 目录中创建一个包含授权规则的新文件。这种方式让 sudo 权限管理更轻松,尤其是在你有许多用户或自动化配置工具时。
使用 visudo 创建该文件,以便语法检查仍然生效:
sudo visudo -f /etc/sudoers.d/linuxize
文件名可以随意取,但最佳实践是用用户名或组名作为文件名。
添加与 sudoers 文件相同的规则:
linuxize ALL
=
(ALL) NOPASSWD:ALL
保存文件并关闭编辑器。确保文件属主为 root 且权限正确;sudo 可能会忽略其他用户可写的文件:
sudo chown root:root /etc/sudoers.d/linuxize
sudo chmod
0440
/etc/sudoers.d/linuxize
验证配置
添加规则后,以目标用户身份运行 sudo -l 验证规则是否生效:
sudo -l
在输出中查找包含 NOPASSWD 的行。如果出现,说明配置已生效。你也可以用 sudo 运行一条命令来测试;它不应再要求输入密码。
故障排查
Sudo still asks for a password(sudo 仍要求输入密码)——检查 /etc/sudoers.d/ 中的文件权限。文件必须属主为 root 且不能被其他用户写入。运行 sudo chmod 0440 /etc/sudoers.d/filename 修复。同时确认规则中的用户名和主机名完全匹配。
Syntax error locks out sudo(语法错误导致无法使用 sudo)——如果你使用了 visudo,它会拒绝保存损坏的文件。如果你用普通编辑器修改文件并失去了 sudo 权限,请进入恢复模式或使用 root shell 修复 /etc/sudoers。这正是应始终使用 visudo 的原因。
Rule is ignored in /etc/sudoers.d/(/etc/sudoers.d/ 中的规则被忽略)——/etc/sudoers.d/ 中的文件名不能包含点号(.)或以波浪号(~)结尾。这些文件会被静默跳过。重命名文件以去掉点或波浪号。
结论
通过 visudo 向 /etc/sudoers 添加 NOPASSWD 规则,或将文件放入 /etc/sudoers.d/ 来配置免密码 sudo,后者更易于管理。只要有可能,就把规则限定到特定命令,而不是使用 NOPASSWD:ALL。关于管理 sudo 访问的更多信息,请参阅我们的 sudo 命令指南和添加用户到 sudoers 指南。