Skip to content

6. 用户与组

6.1 用户管理命令

bash
# 添加用户(Ubuntu 推荐用 adduser 交互式)
sudo adduser john
# 或者用 useradd(需要手动设置密码等)
sudo useradd -m -s /bin/bash john
sudo passwd john

# 修改用户信息
sudo usermod -aG docker john       # 将 john 添加到 docker 组
sudo usermod -s /bin/zsh john      # 修改默认 Shell
sudo usermod -L john               # 锁定账户
sudo usermod -U john               # 解锁账户

# 删除用户
sudo userdel john                  # 删除用户(保留家目录)
sudo userdel -r john               # 删除用户及家目录
bash
$ sudo adduser john
Adding user `john' ...
Adding new group `john' (1001) ...
Adding new user `john' (1001) with group `john' ...
Creating home directory `/home/john' ...
Copying files from `/etc/skel' ...
New password:
Retype new password:
passwd: password updated successfully
Changing the user information for john
Enter the new value, or press ENTER for the default
	Full Name []: John Smith
	Room Number []:
	Work Phone []:
	Home Phone []:
	Other []:
Is the information correct? [Y/n] Y

6.2 组管理

bash
# 创建组
sudo groupadd developers

# 将用户添加到组
sudo usermod -aG developers john
sudo usermod -aG developers jane

# 查看用户所属的组
groups john
id john

# 删除组
sudo groupdel developers
bash
$ id john
uid=1001(john) gid=1001(john) groups=1001(john),27(sudo),1002(developers)

$ groups john
john : john sudo developers

6.3 理解 /etc/passwd

bash
head -3 /etc/passwd
bash
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
john:x:1001:1001:John Smith,,,:/home/john:/bin/bash

每行以 : 分隔,共 7 个字段:

  1. 用户名:john
  2. 密码占位符:x(实际密码存在 /etc/shadow)
  3. UID:1001(用户 ID,0 = root)
  4. GID:1001(主组 ID)
  5. 描述信息:John Smith
  6. 家目录:/home/john
  7. 默认 Shell:/bin/bash

6.4 sudo — 临时提权

bash
# 以 root 权限执行单条命令
sudo apt update

# 切换到 root 用户的 Shell
sudo -i

# 以其他用户身份执行命令
sudo -u www-data cat /var/www/html/index.html

# 编辑 sudoers 文件(安全方式)
sudo visudo

⚠️ 注意: ⚠️ 注意:永远不要直接编辑/etc/sudoers文件,使用visudo命令,它会检查语法错误。语法错误可能导致你失去 sudo 权限!

常见 sudoers 配置

bash
# 允许 john 重启指定服务时无需密码
john ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx

# 允许 developers 组执行特定命令
%developers ALL=(ALL) /usr/bin/systemctl restart nginx

⚠️ 注意NOPASSWD: ALL 等于给账号一把免密 root 钥匙,除非是在受控的自动化账号里并且配合严格的访问控制,否则不要这么写。更安全的做法是只放行确实需要的命令。