Linux 用户管理
Chen Kai CTO

在 Linux 多用户、多任务环境中,用户与组的管理非常关键。本篇解析了 Linux 用户管理的概念、命令与配置文件,让你轻松应对添加、删除、修改用户及组相关操作。

一、Linux 用户管理概述

1.用户与组的基本概念

Linux 系统采用多用户、多任务的设计,每个用户拥有独立的权限与资源配额。用户之间通过分组(Group)来定义共享或隔离的权限:

  • 用户(User): 指在系统中拥有各自身份信息的账号。
  • 组(Group): 多个用户可隶属于同一个组,组定义了某些资源或操作的共享范围。

典型场景:

  • 不同用户共同参与同一项目,需要使用同组权限共享文件。

  • 系统管理员(root)是特权用户,几乎拥有对系统的一切控制权。

  • 系统会默认生成一些假用户,例如 Nginx,是安装软件时自动创建的用户,仅用于完成其份内的工作:

    ![image-20250117150536808](./Linux 用户管理/image-20250117150536808.png)

2.常见配置文件

Linux 的用户信息主要分布在如下几个文件:

  1. /etc/passwd

    • 记录系统中所有用户的基本信息,如用户名、UID(用户 ID)、GID(用户组 ID)等。
    • 每一行代表一个用户,字段间用冒号 : 分割。
  2. /etc/shadow

    • 储存用户的加密密码以及密码过期策略等更敏感的信息。
    • 只有 root 用户或具备特权的用户才可读取。
  3. /etc/group

    • 定义系统中的各个组及其成员列表。
  4. /etc/gshadow

    • 类似 /etc/shadow,存放组密码及更详细的组管理信息。

二、常用用户管理命令

1.useraddpasswduserdel

useradd

用于在系统中创建新用户账号。例如:

1
useradd `testuser`

可选常见参数:

  • -d 指定用户家目录,例如 -d /home/testuser
  • -m 自动创建家目录。
  • -M 不创建用户的家目录。
  • -s 指定用户登录 shell,如 -s /bin/bash,设置 /sbin/nologin 说明用户是无法登录的。
  • -g 设置用户所属初始组,-G 设置附加组(需要有这个组才行)。
  • -c 设置注释。
  • -u 设置 uid(1000 开始)。

passwd

为用户设置或修改密码:

1
passwd `testuser`

若当前用户有权限或是 root,则可以随时更改指定用户的密码。

userdel

用于删除用户账号,常用方式:

1
userdel `testuser`

若要同时移除其家目录,可以加 -r 选项:
userdel -r testuser

但一般建议直接注释掉 /etc/passwd 对应的行,而不是直接删除。

2.usermod

usermod 修改已存在且未登录的用户的属性,如用户名、组、家目录等:

  • -l:修改登录名
  • -g:修改初始组
  • -G:修改或追加附加组
  • -d:更换家目录,如同时使用 -m 可将原家目录内容迁移到新位置
  • -s:更改用户登录 shell
  • -L / -U:锁定/解锁用户密码

示例:

1
usermod -G `developers` -d `/home/newuser` `olduser`

这条命令将 olduser 的家目录改为 /home/newuser 并把他加入 developers 组。

3. 其他查看命令

![image-20250124120244574](./Linux 用户管理/image-20250124120244574.png)

![image-20250124120452049](./Linux 用户管理/image-20250124120452049.png)

三、组管理命令

1.groupaddgroupdelgroupmod

  • groupadd 新建组:groupadd testgroup

    ![image-20250123175003859](./Linux 用户管理/image-20250123175003859.png)

    可以指定组号:

    1
    groupadd -g 组号 组名
  • groupdel 删除组:groupdel testgroup

  • groupmod 修改组名或 GID:groupmod -n newgroupname oldgroupname

2. 用户与组的关联操作

  • 将用户添加到附加组:

    1
    usermod -aG `groupname` `username`

    其中 -a 表示追加,避免覆盖用户原有附加组。

  • 移除用户与某组的关联:需先编辑 /etc/group 或使用一些辅助脚本(如 gpasswd 或手动修改组条目)。

四、UID、GID 与权限关系

1.UID(用户ID)

  • 每个用户在 /etc/passwd 中有唯一的 UID,root 用户 UID 通常为 0。
  • 一些系统服务或伪用户 UID 可能小于 1000(或 500),普通用户 UID 大多从 1000(或 500)开始。

2.GID(组ID)

  • 记录在 /etc/group 中,每个组有唯一的 GID。
  • /etc/passwd 中的 GID 字段指示该用户的初始组,附加组则在 /etc/group 里列出。

3.权限模型

Linux 文件权限基于 User/Group/Other 三个主体,分别有读(r)、写(w)、执行(x)三种权限位:

  • 若当前访问者的 UID 与文件所有者相同,系统使用所有者权限
  • 否则若访问者所在组与文件组相同,则使用组权限
  • 否则使用其他权限

五、账号安全及sudo权限

1.密码安全

  • 修改密码策略(如密码有效期、复杂度)主要在 /etc/shadow 里配置或借助 chage 命令。
  • 建议使用 passwd -n-x 等选项强制密码最短/最长使用天数,或通过 chage 进行交互配置。

2.锁定与解锁用户

  • usermod -L username 可锁定用户,-U 可解锁。
  • 被锁定后,该用户密码无效,无法登录系统。

3.sudoers

  • sudo 允许普通用户在不知 root 密码的情况下以特权运行命令。

  • sudo 配置文件位于 /etc/sudoers,或在 /etc/sudoers.d/ 下。

  • 可通过 visudo 进行编辑,典型格式:

    1
    username ALL=(ALL:ALL) ALL

    表示该用户可在所有主机、以所有用户和组身份,执行所有命令。

    ![image-20250124121720257](./Linux 用户管理/image-20250124121720257.png)

  • 也可以通过这行代码添加 sudoerusermod -aG wheel 用户名

六、系统文件详解

1./etc/passwd 举例

/etc/passwd 是存储用户信息文件,一个典型的 /etc/passwd 行:

1
testuser:x:1001:1001:用户注释:/home/testuser:/bin/bash
  • 用户名:testuser

  • 密码位:x(表示真正密码在 /etc/shadow 中)

  • UID:1001,如身份证号

    • UID 为 0 是超级用户
    • 系统用户 UID 为 1-999,Linux 安装的服务程序都会创建独有的用户负责运行
    • 普通用户 UID 从 1000 开始,由管理员创建,最大值 1000-60000 范围
    • CentOS6 创建普通用户从 500 开始
  • GID:1001,group identify,如户口本的家庭编号

  • Gecos 信息:留空

  • 家目录:/home/testuser

  • 登录 Shell:/bin/bash,这是用户解释器,默认都是 bash,若是禁止用户登录机器,改为 /sbin/nologin 即可(ssh 连接的时候会报错)

![image-20250123172223438](./Linux 用户管理/image-20250123172223438.png)

2./etc/shadow 举例

/etc/shadow是存储用户密码信息的文件,该文件默认权限为 0,即任何其他用户都不得查看,常见字段如:

1
testuser:$6$4kTxu1…:19103:0:99999:7:::
  • $6$ 表示使用 SHA-512 加密
  • 19103 表示最后一次修改密码的日期(自 Epoch 起的天数)
  • 0 / 99999 / 7 等表示密码最短/最长使用期限、过期天数等策略

![image-20250123172315296](./Linux 用户管理/image-20250123172315296.png)

3. /etc/group

存储用户组信息

![image-20250123172506138](./Linux 用户管理/image-20250123172506138.png)

4. /etc/gshadow

存储用户组密码信息,在大公司,用户和组数量很大的情况下,需要制定复杂的权限管理,届时会用到组密码

![image-20250123174653405](./Linux 用户管理/image-20250123174653405.png)

5. /etc/skel

skel 是 skeleton 的缩写,此目录的作用是在建立新用户时,用于初始化用户根目录,系统会把此目录下的所有文件、目录都复制到新建用户的根目录,并且将用户属主与用户组调整为与此根目录相同

![image-20250123174327446](./Linux 用户管理/image-20250123174327446.png)

如果之前创建用户的时候没有创建家目录,可以使用 cp -r /etc/skel/ /home/用户名 来创建。

6. setenv 命令

Windows 的用户变量查询相当于 Linux 中的 env 命令,而系统变量查询相当于 Linux 中的 set 命令。

![image-20250126171434330](./Linux 用户管理/image-20250126171434330.png)

![image-20250126171605322](./Linux 用户管理/image-20250126171605322.png)

PS1 命令行样式修改(只在当前生效)

![image-20250126172212498](./Linux 用户管理/image-20250126172212498.png)

1
2
3
4
5
6
7
8
9
10
11
12
\d :代表日期,格式为weekday month date,例如:"Mon Aug1"
\H:完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux
\h :仅取主机的第一个名字,如上例,则为fc4,.linux则被省略
\t :显示时间为24小时格式,如:HH:MM:SS
\T :显示时间为12小时格式
\A :显示时间为24小时格式:HH:MM
\u :当前用户的账号名称
\v :BASH的版本信息
\w :完整的工作目录名称。家目录会以 ~代替
\W :利用basename取得工作目录名称,所以只会列出最后一个目录
\# :下达的第几个命令
\$ :提示字符,如果是root时,提示符为:# ,普通用户则为:$

set 设置变量

unset 取消设置变量

七、常用实例场景

1.新建用户并指定家目录、Shell

1
2
useradd -m -d `/home/jack` -s `/bin/zsh` `jack`
passwd `jack`
  • -m:自动创建家目录
  • -d:指定家目录路径
  • -s:指定默认 shell

2.为用户指定初始组和附加组

1
useradd -g `devgroup` -G `testgroup,adm` `alex`

初始组为 devgroup,附加组有 testgroupadm

3.将用户移至新家目录

1
usermod -d `/home/newjack` -m `jack`
  • d:更新家目录位置
  • -m:迁移原家目录内容到新位置

4.批量删除用户

1
2
3
for u in `cat users.txt`; do
userdel -r $u
done

通过简单脚本循环删除 users.txt 列表中的所有用户,并 -r 同时删除家目录。

5. 用户互传数据

使用 scp 源目录 目标目录 可以实现将远程目录传到自己目录或者将自己目录传到远程中,需要注意的是我们需要输入对方密码,如果要发送文件夹需要加 -r 指令。并且网络需要都改为桥接,需要保证在同一个网段下才能互传,如果之前设置了静态 IP 需要设置桥接后重新修改为动态。

  • 本文标题:Linux 用户管理
  • 本文作者:Chen Kai
  • 创建时间:2025-02-10 00:00:00
  • 本文链接:https://www.chenk.top/Linux 用户管理/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论