Linux用户和用户组管理

Linux 用户和用户组管理详解(新手详细版)

本文档面向零基础新手,从“Linux 里谁在用、怎么区分权限”讲起,详细说明用户、用户组、相关配置文件、增删改查、密码、切换身份、sudo 等,并配有大量示例。


一、为什么要学“用户和用户组”?

在 Linux 里:

  • 每个进程都会以某个用户的身份运行。
  • 每个文件都有所有者(属主)和所属组(属组)。
  • 系统通过用户用户组来决定“谁可以做什么”。

学会用户和用户组管理,你才能:新建账号、改密码、把用户加入某个组、用 sudo 临时提权、理解为什么有些命令要加 sudo。下面从最基础的概念讲起。


二、核心概念

2.1 用户(User)

  • 用户就是系统里的一个“账号”,用来登录、运行程序、拥有文件。
  • 每个用户有一个用户名(如 zhangsan)和一个用户 ID(UID),系统内部更多用 UID 区分。
  • 分为两类常见说法:
    • root:超级管理员,UID 为 0,权限最大。
    • 普通用户:UID 一般从 1000 起(各发行版可能不同),权限受限制。

还有系统用户(如 www-data、nginx),UID 较小,一般不用于登录,只用于跑服务。

2.2 用户组(Group)

  • 用户组把多个用户归为一组,便于批量给权限:把某个目录的属组设为 dev,那 dev 组里所有人都有一份相同的权限。
  • 每个组有组名组 ID(GID)
  • 每个用户至少属于一个组,这个组叫主组(primary group);还可以加入多个附加组(supplementary groups)

2.3 属主、属组与权限的关系(回顾)

  • 文件的属主:拥有该文件的用户。
  • 文件的属组:拥有该文件的组;组内成员共享“属组权限”。
  • 权限分三组:属主、属组、其他人(r/w/x)。
    所以:用户身份 = 属主?属组成员?还是其他人? → 决定用哪一组权限。
# 看一个文件的属主、属组
ls -l /etc/passwd
# -rw-r--r-- 1 root root ... /etc/passwd
#            ↑    ↑
#          属主  属组

三、用户和组的信息存在哪里?

3.1 /etc/passwd:用户账号信息(不含密码)

每一行一个用户,字段用冒号 : 分隔。

cat /etc/passwd

典型一行示例:

zhangsan:x:1000:1000:张三:/home/zhangsan:/bin/bash
字段顺序 含义 上例中的值
1 用户名 zhangsan
2 密码占位(真实密码在 /etc/shadow) x
3 UID 1000
4 主组 GID 1000
5 注释/全名等(GECOS) 张三
6 主目录 /home/zhangsan
7 登录 Shell /bin/bash

若第 7 字段是 /usr/sbin/nologin/bin/false,表示该用户不能登录(常用于系统账号)。

3.2 /etc/shadow:密码与过期信息(仅 root 可读)

存的是加密后的密码和过期、锁定等安全信息。普通用户无法查看。

sudo cat /etc/shadow

一行示例:

zhangsan:$6$xxx...:19000:0:99999:7:::

常见字段:用户名、加密密码、上次改密码天数、最小间隔、最大有效天数、警告天数等。
密码为 !* 通常表示不能登录(未设密码或已禁用)。

3.3 /etc/group:组信息

每一行一个组,格式:

组名:密码占位:GID:属于该组的用户列表(逗号分隔,不含主组)
cat /etc/group

示例:

zhangsan:x:1000:
devteam:x:1001:zhangsan,lisi
  • zhangsan 的主组是 GID 1000(zhangsan 组)。
  • devteam 组 GID 1001,附加组成员有 zhangsan、lisi。

3.4 /etc/gshadow:组密码等(可选,少用)

存组的密码(若启用),一般新手不用改,了解即可。


四、查看“当前用户”和“属于哪些组”

4.1 当前是谁:whoami

whoami
# 输出当前登录用户名,例如:zhangsan

4.2 详细身份:id

id
# 输出当前用户的 UID、GID、所属组列表

示例输出:

uid=1000(zhangsan) gid=1000(zhangsan) groups=1000(zhangsan),1001(devteam)

看指定用户:

id zhangsan
id root

4.3 当前用户属于哪些组:groups

groups
# 输出:zhangsan devteam

groups lisi
# 输出 lisi 所属的组

4.4 谁在登录:who、w

who
# 当前登录的用户、终端、登录时间

w
# 更详细:谁在做什么(当前执行的命令)

五、添加用户

5.1 useradd(通用)

需要 root 权限,一般用 sudo

sudo useradd 用户名

这样会:

  • /etc/passwd/etc/group 里添加一行;
  • 主组默认与用户名同名的组;
  • 主目录默认不创建(取决于发行版),Shell 多为 /bin/sh

常用选项

选项 含义
-m 创建主目录(如 /home/用户名)
-s 指定登录 Shell,如 -s /bin/bash
-c 注释(全名等),如 -c "张三"
-d 指定主目录路径
-g 指定主组(组名或 GID)
-G 指定附加组(多个用逗号)
-u 指定 UID
-e 账号过期日期

5.2 示例:创建一个“像正常人用”的用户

# 创建用户,并创建主目录、使用 bash
sudo useradd -m -s /bin/bash -c "张三" zhangsan

# 查看是否在 passwd 里
grep zhangsan /etc/passwd
# zhangsan:x:1001:1001:张三:/home/zhangsan:/bin/bash

# 主目录是否创建
ls -ld /home/zhangsan

此时用户还没有密码,需要设置后才能用密码登录:

sudo passwd zhangsan
# 按提示输入两次新密码

5.3 adduser(Debian/Ubuntu 推荐)

在 Debian、Ubuntu 上,adduser 是交互式脚本:会自动创建主目录、提示设密码、创建同名组等,对新手更友好。

sudo adduser lisi
# 会提示输入密码、全名等

创建完成后可检查:

grep lisi /etc/passwd
id lisi

六、修改用户:usermod

需要 root,用 sudo usermod 选项 用户名

6.1 常用选项

选项 含义
-s 改登录 Shell,如 -s /bin/bash-s /usr/sbin/nologin
-d 改主目录路径(不自动迁移文件,一般配合 -m 移动内容)
-m -d 一起用时,把旧主目录内容移到新主目录
-c 改注释(全名)
-l 改用户名(登录名)
-g 改主组
-G 改附加组(会覆盖原有附加组!想“追加”用 -aG
-aG 把用户追加到某组(不删掉原有附加组)
-L 锁定账号(不能登录)
-U 解锁账号
-e 账号过期日期

6.2 示例

# 把 zhangsan 的 Shell 改为禁止登录(适合做系统账号)
sudo usermod -s /usr/sbin/nologin zhangsan

# 改回 bash
sudo usermod -s /bin/bash zhangsan

# 把 zhangsan 加入 devteam 组(追加,不删原有组)
sudo usermod -aG devteam zhangsan
groups zhangsan
# zhangsan devteam

# 锁定账号(shadow 里密码前会加 !)
sudo usermod -L zhangsan
# 解锁
sudo usermod -U zhangsan

注意-G覆盖附加组,只想“多加一个组”时一定要用 -aG


七、删除用户:userdel

需要 root

sudo userdel 用户名
  • 只删账号(passwd/shadow 等),不删主目录
  • 若想连主目录一起删sudo userdel -r 用户名
# 只删账号
sudo userdel tempuser

# 删账号并删主目录(谨慎!)
sudo userdel -r tempuser

若该用户正在登录或有进程在跑,可能删不掉,需先踢出或结束进程。


八、密码管理

8.1 为自己设密码:passwd(无参数)

passwd
# 提示输入当前密码,再输入两次新密码

8.2 root 为别人设密码:passwd 用户名

sudo passwd zhangsan
# 直接输入两次新密码,不需要知道旧密码

8.3 锁定/解锁用户密码(禁止登录)

# 锁定:用户无法用密码登录
sudo passwd -l zhangsan

# 解锁
sudo passwd -u zhangsan

8.4 清空密码(设为空,危险,少用)

sudo passwd -d zhangsan

8.5 过期与策略(可选了解)

# 查看某用户密码状态(过期等)
sudo passwd -S zhangsan

# 强制用户下次登录改密码
sudo passwd -e zhangsan

九、切换用户身份:su 与 sudo

9.1 su:切换到另一用户(并加载其环境)

# 切换到 root(会提示输入 root 密码)
su -

# 切换到 zhangsan(会提示输入 zhangsan 的密码)
su - zhangsan
  • su - 会加载目标用户的登录环境(主目录、环境变量等)。
  • su zhangsan(没有 -)只换身份,不彻底切环境。

退出该用户回到原来:

exit
# 或 Ctrl+D

9.2 sudo:用当前用户密码“临时以 root 执行一条命令”

不需要知道 root 密码,只要当前用户在 sudoers 里被允许即可。

sudo 命令
# 例如:
sudo apt update
sudo useradd newuser

第一次用可能提示输入当前用户自己的密码,之后一段时间内可能不再问。

9.3 以其他用户身份执行一条命令(sudo -u)

sudo -u zhangsan whoami
# 输出:zhangsan

sudo -u www-data cat /var/www/html/index.html

9.4 配置谁能用 sudo:/etc/sudoers 与 sudo 组

  • 不要直接 vim /etc/sudoers 改,容易语法错误导致所有人都无法 sudo。
  • 推荐:sudo visudo,有语法检查。
  • 常见做法:把用户加入 sudo 组(或 wheel 组,视发行版而定),该组默认在 sudoers 里:
sudo usermod -aG sudo zhangsan
# 或
sudo usermod -aG wheel zhangsan

加入后,该用户重新登录后即可使用 sudo


十、用户组管理

10.1 创建组:groupadd

sudo groupadd 组名

# 指定 GID
sudo groupadd -g 2000 devteam

10.2 修改组:groupmod

# 改组名
sudo groupmod -n newname oldname

# 改 GID
sudo groupmod -g 2001 devteam

10.3 删除组:groupdel

sudo groupdel 组名

若某用户的主组是该组,需先把该用户的主组改掉或先删用户,才能删组。

10.4 把用户加入组 / 从组里移除

方法一:usermod -aG(追加到附加组)

sudo usermod -aG devteam zhangsan
groups zhangsan

方法二:gpasswd

# 把用户加入组
sudo gpasswd -a zhangsan devteam

# 把用户从组里移除
sudo gpasswd -d zhangsan devteam

注意:改组后,要重新登录(或新开一个终端用 newgrp 组名)后,新组才在 idgroups 里生效。

10.5 查看组里有哪些用户

# 看 /etc/group 里该组那一行(最后一列是附加组成员)
grep devteam /etc/group
# devteam:x:1001:zhangsan,lisi

# 或用 getent(会查 NIS/LDAP 等)
getent group devteam

十一、主组与附加组(再强调一下)

  • 主组(primary group):用户创建文件时,默认的“属组”就是这个主组;在 /etc/passwd 里 GID 那列。
  • 附加组:在 /etc/group 里各组的最后一列列出;用于额外授权,不改变“默认属组”。
# 查看主组和所有组
id zhangsan
# uid=1000(zhangsan) gid=1000(zhangsan) groups=1000(zhangsan),1001(devteam)
#                    ↑ 主组              ↑ 所有组(含主组)

把用户加入某组用 usermod -aG 组名 用户名,改主组用 usermod -g 组名 用户名(少用)。


十二、一条龙示例:从建组、建用户到授权

下面在一台机器上演示:建组 → 建用户 → 设密码 → 加入组 → 用 sudo。

# 1. 创建组
sudo groupadd devteam

# 2. 创建用户并加入组(创建时指定附加组)
sudo useradd -m -s /bin/bash -c "开发-张三" zhangsan
sudo usermod -aG devteam zhangsan

# 3. 设密码
sudo passwd zhangsan

# 4. 让 zhangsan 能用 sudo(加入 sudo 组)
sudo usermod -aG sudo zhangsan

# 5. 验证
id zhangsan
# uid=1001(zhangsan) gid=1001(zhangsan) groups=1001(zhangsan),1002(devteam),1003(sudo)
grep zhangsan /etc/passwd
getent group devteam

然后可以用另一终端或 SSH 用 zhangsan 登录,执行 groupssudo whoami 验证。


十三、与文件权限的配合(简要)

  • 新建文件的属主=当前用户,属组=当前用户的主组
  • 若希望某目录下新建文件属组固定为 devteam,可:
    • 把目录属组设为 devteam;
    • 给目录设 setgid(chmod g+s),这样新建文件会自动继承目录的属组。
sudo chown :devteam /opt/project
sudo chmod g+s /opt/project
# 之后 zhangsan、lisi 在该目录下创建的文件,属组都会是 devteam

十四、安全与习惯建议(新手必读)

  1. 日常不用 root 登录:用普通用户 + 需要时 sudo
  2. 强密码:尤其是 root 和能 sudo 的用户。
  3. 禁用不需要登录的用户usermod -s /usr/sbin/nologinpasswd -l
  4. 慎用 userdel -r:确认主目录里没有重要数据再删。
  5. 改 sudoers 用 visudo:不要直接编辑 /etc/sudoers
  6. 加组用 -aG:避免 usermod -G 覆盖原有附加组。

十五、命令速查表

需求 命令示例
当前用户 whoamiid
当前用户所属组 groups
谁在登录 whow
看用户/组配置 cat /etc/passwdcat /etc/groupgetent group 组名
添加用户 sudo useradd -m -s /bin/bash 用户名sudo adduser 用户名
设密码 passwd(自己)、sudo passwd 用户名(别人)
改用户 sudo usermod -aG 组名 用户名sudo usermod -s /bin/bash 用户名
删用户 sudo userdel 用户名sudo userdel -r 用户名
锁定/解锁 sudo passwd -l 用户名sudo passwd -u 用户名
创建组 sudo groupadd 组名
删组 sudo groupdel 组名
用户加入组 sudo usermod -aG 组名 用户名sudo gpasswd -a 用户 组
用户离开组 sudo gpasswd -d 用户 组
切换用户 su -su - 用户名
以 root 执行一条 sudo 命令
以某用户执行一条 sudo -u 用户名 命令
配置 sudo sudo visudo、把用户加入 sudo 组

十六、小结

  • 用户:账号、UID、root/普通用户;信息在 /etc/passwd,密码在 /etc/shadow
  • 用户组:组名、GID;信息在 /etc/group;主组 + 附加组决定权限。
  • 常用操作useradd/adduserusermoduserdelpasswdgroupaddgroupdelusermod -aGgpasswd
  • 身份与权限whoamiidgroups;切换用 su、临时提权用 sudo;改 sudo 用 visudo 或把用户加入 sudo 组。

建议在虚拟机或测试机上按本文示例练习,再结合 Linux简介.mdLinux文件基本属性.md 理解“属主、属组、权限”的关系,这样用户和用户组管理就串起来了。


文档以常见 Linux 发行版(如 Ubuntu、Debian、CentOS)为准;不同发行版在 UID 范围、默认组名(sudo/wheel)上可能略有差异。

发表评论