当前位置:首页>Linux>Linux 基础:用户详解

Linux 基础:用户详解

  • 2026-09-08 23:38:43
Linux 基础:用户详解

在 Linux 系统中,用户(User)是系统安全和权限管理的核心组成部分。理解用户的概念、类型、配置文件以及相关管理命令,对于系统管理员和普通用户都至关重要。本文将从基础概念出发,深入浅出地讲解 Linux 用户系统的组成与使用。

一、什么是 Linux 用户?

Linux 是一个多用户、多任务的操作系统。每个登录到系统的人都对应一个“用户账户”,系统通过该账户识别身份,并据此分配资源、控制访问权限。

用户不仅用于人机交互,还用于运行服务进程(如 Web 服务器、数据库等),这些被称为“系统用户”或“服务账户”。

二、用户类型

Linux 中的用户主要分为两类:

普通用户(Regular User)

  • 通常由系统管理员创建,供实际用户使用。
  • UID(用户 ID)一般从 1000 开始(不同发行版可能略有差异)。
  • 权限受限,不能直接修改系统关键文件。

系统用户(System User / Service User)

  • 用于运行后台服务(如 mysql、nginx 等)。
  • UID 通常在 1~999 之间。
  • 一般禁止登录(shell 设置为 /sbin/nologin 或 /usr/sbin/nologin)。

特殊用户:root

  • 超级用户,UID 为 0。
  • 拥有对系统的完全控制权。
  • 应谨慎使用,避免误操作导致系统损坏。

三、核心配置文件

Linux 用户信息主要存储在以下几个关键文件中:

/etc/passwd

  • 存储用户的基本信息(不包含密码)。
  • 每行代表一个用户,字段用冒号 : 分隔,格式如下:
username:x:UID:GID:GECOS:home_directory:shell

例如:
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
alice:x:1001:1001:Alice Smith:/home/alice:/bin/bash
hcrm:x:1000:1000::/home/hcrm:/bin/bash

其中各字段的含义如下:

  • username:用户名,是用户在系统中的唯一标识。
  • password:加密后的用户密码。在现代系统中,这个字段通常包含 'x' 或 '*',而实际的密码信息存储在 /etc/shadow 文件中。
  • UID:用户标识号(User ID),是一个唯一的数字,用于标识用户。0 是保留给超级用户(root)的 UID。
  • GID:组标识号(Group ID),表示用户所属的主要用户组的 GID。
  • GECOS:通用加密传输标志(General Electric Comprehensive Operating System)的缩写。在现代系统中,通常是用户的全名或注释信息。
  • home_directory:用户的家目录,是用户登录后的初始工作目录。
  • shell:用户登录时使用的 shell。它决定了用户在命令行下输入命令时使用的命令解释器。

/etc/shadow

  • 存储用户的加密密码及其他密码策略信息(如过期时间)。
  • 只有 root 用户可读。
  • 格式:
username:encrypted_password:last_change:min_age:max_age:warning:inactive:expire:reserved

例如:
user1:$6$6gGt2UcM$3rPcBwc7xk8L2jHr6Vq8d7r5k6PPbVj0ILcZTQ3tNzMQGWwVApRfXKvh0xF9ZUuSmXghlL8SRd9Ozg3AZqTyV1:18868:0:99999:7:::

/etc/shadow 文件的主要字段:

  1. 用户名(Login Name): 用户的登录名。
  2. 加密后的密码(Encrypted Password): 存储用户的加密后的密码。实际的密码不会以明文形式存储,而是通过加密算法(如 MD5、SHA-256)进行加密。
  3. 密码最后修改日期(Last Password Change): 表示密码最后一次更改的日期(从 1970 年 1 月 1 日以来的天数)。
  4. 密码生命周期信息(Password Expiry Information): 包括密码的最小和最大使用期限、警告期限和过期后的宽限期。
  5. 账户过期日期(Account Expiry Date): 表示账户过期的日期(从 1970 年 1 月 1 日以来的天数)。
  6. 账户禁用天数(Inactive Days): 如果设置,表示在密码过期后多少天账户将被禁用。
  7. 账户失效日期(Account Expiry Date): 表示账户失效的日期(从 1970 年 1 月 1 日以来的天数)。
  8. 保留字段: 保留供将来使用的字段。

/etc/group

  • 定义用户组信息。
  • 格式:
groupname:password:GID:user_list

[root@iZ2zehegwjg73eh63wad2pZ ~]# cat /etc/group
root:x:0:
# 例子:这表示有一个名为 root 的组,GID 为 0,包含两个成员:0、test。
root:x:0:test

其中各字段的含义如下:

  • group_name:组名,表示用户组的名称。
  • x:密码字段,通常为空。实际的密码信息存储在 /etc/gshadow 文件中,但在现代系统中,这个字段通常被省略。
  • GID:组标识号(Group ID),是一个唯一的数字,用于标识用户组。
  • member1,member2,...:属于该组的用户列表。

/etc/gshadow

  • 组密码和管理员信息(类似 /etc/shadow 对应组)。

四、用户与组的关系

在 Linux 中,每个用户必须属于至少一个主组,也可以加入多个附加组。

  • 主组通常与用户名同名(如用户 alice 的主组也是 alice)。
  • 通过组可以批量管理权限,例如让多个用户共享某个目录。

查看当前用户所属组:

[root@iZ2zehegwjg73eh63wad2pZ ~]# id
uid=0(root) gid=0(root) 组=0(root)
[root@iZ2zehegwjg73eh63wad2pZ ~]# groups
root

五、常用用户管理命令

创建用户

# 其中,[options] 是可选的参数,可以根据需要添加,username 是要创建的新用户的用户名。
sudo useradd [options] username

# 例子
sudo useradd -m -s /bin/bash alice
# 这个命令的各个部分含义如下:
# sudo: 使用超级用户权限执行命令。
# useradd: 新增用户的命令。
# -m: 创建用户家目录(/home/alice)。
# -s /bin/bash: 指定用户登录时使用的 shell,通常为 /bin/bash。
# alice: 新增用户的用户名。

# 最简单的创建用户,默认情况下,useradd 命令会自动为新用户创建家目录,除非你明确指定不创建,可以使用 -M 选项,如:sudo useradd -M test
sudo useradd test

# 创建用户的家目录
sudo useradd -m test

# 创建用户的家目录并指定用户家目录,-d 选项可以指定家目录的路径
sudo useradd -m -d /home/testtest

# 创建用户的家目录并指定用户登录时使用的shell
sudo useradd -m -s /bin/bash test

# 接着,你可以为用户设置密码,可以使用 passwd 命令,系统会要求你输入密码两次以确认
sudo passwd test

# 指定用户组:-g 选项用于指定用户的主要用户组。
sudo useradd -g developers john
# 指定多个用户组:-G 选项用于指定用户的附加用户组,以逗号分隔多个组名。
sudo useradd -g developers -G wheel,users john


# 添加用户并设置密码:创建用户 "jane",将其添加到 "users" 主要组和 "wheel" 附加组,设置密码。
sudo useradd -m -d /home/jane -g users -G wheel jane
sudo passwd jane

# -r 选项用于创建系统用户,这样用户的 UID 会小于 1000。
sudo useradd -r systemuser

修改用户信息

sudo usermod [options] username

# 例子
# 修改用户家目录:使用 -d 选项可以修改用户的家目录。
sudo usermod -d /new/home/directory john

# 修改用户登录名(用户名):使用 -l 选项可以修改用户的登录名。
sudo usermod -l newusername oldusername

# 修改用户主要组:使用 -g 选项可以修改用户的主要组。
sudo usermod -g newgroup john

# 添加用户到附加组:使用 -aG 选项可以将用户添加到附加组,而不影响其原有的组。
sudo usermod -aG additionalgroup john

# 修改用户密码:使用 passwd 命令可以修改用户的密码。
sudo passwd john

# 禁用用户账户:使用 -L 选项可以锁定用户账户,禁止其登录。
sudo usermod -L john

# 解锁用户账户:使用 -U 选项可以解锁用户账户,允许其登录。
sudo usermod -U john

# 修改用户 shell:使用 -s 选项可以修改用户的默认 shell。
sudo usermod -s /bin/bash john
# 禁止 bob 登录
sudo usermod -s /sbin/nologin bob

# 设置用户过期时间:使用 -e 选项可以设置用户账户的过期时间。
sudo usermod -e 2023-01-31 john

设置/修改密码

sudo passwd alice

删除用户

sudo userdel [options] username

# 例子
# 最简单的删除用户:这会删除用户 "john",但不会删除与之相关的家目录和邮件。
sudo userdel john

# 删除用户并删除家目录:使用 -r 选项可以删除用户的家目录和邮件等相关文件。
sudo userdel -r john

# 删除用户但保留家目录:使用 -r 选项删除用户的家目录,并使用 --preserve-home 选项保留家目录。
sudo userdel -r --preserve-home jane

# 删除用户的同时删除用户组:使用 -Z 选项可以同时删除用户的主要组。
sudo userdel -r -Z john

# 删除用户组但不删除家目录:使用 -g 选项可以指定用户的主要组,-r 选项删除用户的家目录。
sudo userdel -r -g developers john

# 删除用户组但保留家目录:使用 -Z 选项可以同时删除用户的主要组,-r 选项保留用户的家目录。
sudo userdel -r -Z developers john

查看用户信息

# 查看当前用户
id
# 查看指定用户
id alice

其他命令

# 显示当前登录到系统的用户的信息,包括用户名、终端、登录时间等。
who
# 命令显示当前登录用户的详细信息,包括用户、终端、登录时间、当前执行的命令等。
w
# 命令用于查询系统数据库(例如 /etc/passwd 文件)中的用户信息。
getent passwd
# 查看passwd文件
cat /etc/passwd
# 使用 cut 或 awk 命令可以从 /etc/passwd 文件中提取所有用户名信息。
cut -d: -f1 /etc/passwd
awk -F: '{print $1}' /etc/passwd

六、用户组

在 Linux 系统中,用户组是一种组织和管理用户的方式。用户组允许将用户集中在一起,并通过分配组的权限来简化权限管理。

用户组的基本概念:

  • 组标识号(GID): 每个用户组都有一个唯一的组标识号,用于在系统中标识该组。组标识号在 /etc/group 文件中分配。
  • 用户组的名称: 用户组通常由一个可读的名称来标识,例如 users、developers、admins 等。

主要组和附加组:

  • 主要组(Primary Group): 每个用户都属于一个主要组,这是用户创建时指定的默认组。主要组的组标识号在 /etc/passwd 文件中指定。
  • 附加组(Supplementary Groups): 用户可以属于一个或多个附加组,这允许他们在多个组中共享资源和权限。附加组的信息存储在 /etc/group 文件中。

增加用户组

# 例如,创建一个名为 mygroup 的用户组:
sudo groupadd mygroup

修改用户组

# 例如,将名为 oldgroup 的用户组改为 newgroup:
sudo groupmod -n newgroup oldgroup

#
 修改用户组的 GID:例如,将名为 mygroup 的用户组的 GID 修改为 1001:
sudo groupmod -g 1001 mygroup

查询用户组

# 使用 grep 命令结合 /etc/group 文件来查询用户组信息。例如,查询名为 mygroup 的用户组信息:
grep mygroup /etc/group
# 或者直接使用 getent 命令:
getent group group_name

删除用户组

# 例如,删除名为 mygroup 的用户组:
sudo groupdel mygroup

七、常见案例

给开发人员新增账号的权限

# 创建新的用户账号
sudo useradd -m -s /bin/bash xiefei

#
 创建开发人员组
sudo groupadd developers
# 将用户添加到开发人员组
sudo usermod -aG developers xiefei

#
 设置密码
sudo passwd 123456

#
 分权限:确保开发人员可以在需要的目录中工作。
sudo chown -R :developers /opt # 将目录的所属组设置为开发人员组。
sudo chmod -R 770 /opt         # 为目录分配读写执行权限给所有者和组


#
 分配开发组sudo 权限
# 1、编辑 /etc/sudoers 文件
sudo visudo
# 2、在文件中添加一行:这将允许 developers 组的成员使用 sudo 执行任何命令。
%developers  ALL=(ALL:ALL) ALL
# 3、然后退出编辑模式,:wq保存即可

八、用户权限与安全建议

  • 最小权限原则:普通用户不应拥有 root 权限,必要时使用 sudo。
  • 禁用 root 远程登录:在 /etc/ssh/sshd_config 中设置 PermitRootLogin no。
  • 定期审计用户账户:检查是否有异常账户或长期未使用的账户。
  • 使用强密码策略:可通过 PAM 模块或 chage 命令设置密码有效期。

九、常见问题

分配超级用户权限?

让开发人员可以执行一些需要超级用户权限的任务,例如安装软件。sudo visudo 是一个命令,用于编辑 /etc/sudoers 文件,这个文件定义了系统上哪些用户或者用户组被授予使用 sudo 命令的权限。

  • sudo: 允许普通用户以超级用户(root)的身份执行特定命令的命令。
  • visudo: 使用 visudo 工具编辑 /etc/sudoers 文件,确保在编辑时进行语法检查,以防止出现错误。
“

通过使用 visudo,系统管理员可以安全地编辑 sudoers 文件,避免由于语法错误导致的权限问题。visudo 使用 vi 编辑器来打开文件,但在保存和退出时,会检查文件的语法错误。如果有语法错误,它会阻止保存并提示错误信息,防止无效的配置导致系统安全性问题。

sudo visudo

#
 在文件中添加一行:这将允许 developers 组的成员使用 sudo 执行任何命令。
%developers  ALL=(ALL:ALL) ALL

用户忘记密码怎么办?

方式一:使用 root 重置用户密码

  1. 使用 root 权限登录
  2. 重置用户密码:使用 passwd 命令重置用户的密码。例如,如果用户是 "john",执行以下命令:
# 系统会提示你输入新的密码。输入并确认新密码。
sudo passwd john

主要组和附加组区别?

主要组:

  • 唯一性: 每个用户只能有一个主要组。
  • 默认行为: 当用户创建文件或目录时,它们的主要组通常被分配为创建用户时的默认组。
  • 关系: 用户的主要组通常与其用户名相同,但系统管理员可以在创建用户时选择将其分配到其他主要组。
  • /etc/passwd 文件: 用户的主要组信息存储在 /etc/passwd 文件中。

附加组:

  • 多样性: 用户可以属于多个附加组,而不仅仅是一个。
  • 权限继承: 用户的附加组用于赋予用户对某些文件或目录的附加权限。
  • /etc/group 文件: 用户的附加组信息存储在 /etc/group 文件中。
“

总的来说,主要组用于标识用户默认的组,而附加组提供了更灵活的权限管理,允许用户属于多个组。

su和sudo区别?

su:是 linux 切换用户的命令

  • linux 在切换用户的时候,不需要像 windows 一样先注销当前用户才可以切换到另一个用户
  • 直接使用 su 命令就可以切换,并且使用 exit 命令就能退出当前用户,返回到登录前的用户
  • root 用户使用 su 命令切换到其他普通用户不需要输入密码
  • 普通用户使用 su 命令切换到其他普通用户和 root 用户都是需要输入密码的
  • su -和 su是有区别的
    • su -表示完全登录到指定的用户,会把 env 命令的变量切换成登陆后的用户
    • su不会把 env 命令的变量切换成登陆后的用户,而是沿用切换前用户的 env 变量
  • 如果一个用户被分配了 /sbin/nologin 这种 shell 时,他是不能被登录的,但是这个用户可以启动有自己权限的服务

sudo:是 linux 普通用户临时提权时需要带上的命令

最新文章

随机文章