长期用 root 账号操作服务器是一种危险习惯——任何误操作都会以最高权限执行,后果往往不可挽回。最佳实践是创建一个普通用户,日常以该账号登录,需要高权限时用 sudo 提权,做到最小权限原则。本文教你完整完成这一配置。

本文要点

  • 用 adduser 创建新用户
  • 将用户加入 sudo/wheel 组
  • 用 visudo 安全编辑权限配置
  • 切换用户与测试 sudo 权限

创建新用户

Debian/Ubuntu:adduser

adduser 是 Debian 系的高级封装命令,会自动创建主目录并引导设置密码:

adduser deploy

按提示设置密码,其余信息(Full Name 等)可直接回车跳过。

CentOS/AlmaLinux:useradd

useradd -m -s /bin/bash deploy
passwd deploy

其中 -m 创建主目录,-s /bin/bash 指定默认 Shell。

用户名建议

用户名推荐使用小写字母,如 deploy、admin、ubuntu 等,避免与系统保留用户名冲突。不要用 test、temp 等容易遗忘的名字。

将用户加入 sudo/wheel 组

发行版sudo 组名命令
Debian/Ubuntusudousermod -aG sudo deploy
CentOS/AlmaLinuxwheelusermod -aG wheel deploy
# Debian/Ubuntu
usermod -aG sudo deploy

# CentOS/AlmaLinux
usermod -aG wheel deploy

执行后用 id deploy 确认组信息:

id deploy
# 输出示例:uid=1001(deploy) gid=1001(deploy) groups=1001(deploy),27(sudo)

用 visudo 配置权限

如果需要给用户更细粒度的权限(如无密码 sudo 或只允许特定命令),应通过 visudo 编辑配置,它会在保存时校验语法,避免写错导致 sudo 失效:

visudo

常见配置示例:

# 允许 deploy 用户无密码使用 sudo
deploy ALL=(ALL) NOPASSWD:ALL

# 只允许 deploy 执行 systemctl restart nginx
deploy ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx

不要直接编辑 sudoers 文件

始终用 visudo 而非 nano/vim 直接编辑 /etc/sudoers。visudo 提供语法检查;直接编辑写错会导致所有用户都无法使用 sudo,须从紧急控制台修复。

切换用户与测试

以 root 身份切换到新用户:

su - deploy

测试 sudo 权限:

sudo whoami
# 若返回 root,说明配置正确

为新用户配置 SSH 密钥登录

新用户也应使用密钥登录。以 root 身份为 deploy 创建 .ssh 目录并写入公钥:

mkdir -p /home/deploy/.ssh
chmod 700 /home/deploy/.ssh
echo '你的公钥内容' > /home/deploy/.ssh/authorized_keys
chmod 600 /home/deploy/.ssh/authorized_keys
chown -R deploy:deploy /home/deploy/.ssh

小结

  • adduser(Debian)或 useradd(CentOS)创建普通用户
  • usermod -aG sudo/wheel 加入提权组
  • visudo 配置细粒度权限,不要直接编辑 sudoers
  • 日常用普通用户登录,避免长期以 root 操作

常见问题

普通用户执行 sudo 需要输密码吗?

默认需要输入该用户自己的密码来确认。如想免密,可在 visudo 中为该用户添加 NOPASSWD:ALL 配置。

加入 sudo 组后需要重新登录吗?

是的,组变更需要重新登录(或 su - 用户名)后才会生效,当前会话不会立即刷新。

如何删除不再需要的用户?

使用 userdel -r 用户名 命令,-r 参数同时删除主目录和邮件目录。操作前确认该用户没有正在运行的进程。