在 Linux 系统中,用户(User)是系统安全和权限管理的核心组成部分。理解用户的概念、类型、配置文件以及相关管理命令,对于系统管理员和普通用户都至关重要。本文将从基础概念出发,深入浅出地讲解 Linux 用户系统的组成与使用。
一、什么是 Linux 用户?
Linux 是一个多用户、多任务的操作系统。每个登录到系统的人都对应一个“用户账户”,系统通过该账户识别身份,并据此分配资源、控制访问权限。
用户不仅用于人机交互,还用于运行服务进程(如 Web 服务器、数据库等),这些被称为“系统用户”或“服务账户”。
二、用户类型
Linux 中的用户主要分为两类:
普通用户(Regular User)
- UID(用户 ID)一般从 1000 开始(不同发行版可能略有差异)。
系统用户(System User / Service User)
- 用于运行后台服务(如
mysql、nginx 等)。 - 一般禁止登录(shell 设置为
/sbin/nologin 或 /usr/sbin/nologin)。
特殊用户:root
三、核心配置文件
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
- 存储用户的加密密码及其他密码策略信息(如过期时间)。
username:encrypted_password:last_change:min_age:max_age:warning:inactive:expire:reserved
例如:
user1:$6$6gGt2UcM$3rPcBwc7xk8L2jHr6Vq8d7r5k6PPbVj0ILcZTQ3tNzMQGWwVApRfXKvh0xF9ZUuSmXghlL8SRd9Ozg3AZqTyV1:18868:0:99999:7:::
/etc/shadow 文件的主要字段:
- 加密后的密码(Encrypted Password): 存储用户的加密后的密码。实际的密码不会以明文形式存储,而是通过加密算法(如 MD5、SHA-256)进行加密。
- 密码最后修改日期(Last Password Change): 表示密码最后一次更改的日期(从 1970 年 1 月 1 日以来的天数)。
- 密码生命周期信息(Password Expiry Information): 包括密码的最小和最大使用期限、警告期限和过期后的宽限期。
- 账户过期日期(Account Expiry Date): 表示账户过期的日期(从 1970 年 1 月 1 日以来的天数)。
- 账户禁用天数(Inactive Days): 如果设置,表示在密码过期后多少天账户将被禁用。
- 账户失效日期(Account Expiry Date): 表示账户失效的日期(从 1970 年 1 月 1 日以来的天数)。
/etc/group
groupname:password:GID:user_list
[root@iZ2zehegwjg73eh63wad2pZ ~]# cat /etc/group
root:x:0:
# 例子:这表示有一个名为 root 的组,GID 为 0,包含两个成员:0、test。
root:x:0:test
其中各字段的含义如下:
- 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 重置用户密码
- 重置用户密码:使用 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 -表示完全登录到指定的用户,会把 env 命令的变量切换成登陆后的用户
- su不会把 env 命令的变量切换成登陆后的用户,而是沿用切换前用户的 env 变量
- 如果一个用户被分配了 /sbin/nologin 这种 shell 时,他是不能被登录的,但是这个用户可以启动有自己权限的服务
sudo:是 linux 普通用户临时提权时需要带上的命令