Linux用户和组管理
用户和组介绍
用户(User):就像社区里的每个 “居民”
每个用户都有自己独一无二的 “身份证”—— 用户 ID(UID),系统通过它精准识别 “是谁”。比如 root 用户,就像社区里的 “管理员”,手握最高权限,能随便改社区的规矩(比如删除文件、安装软件);而普通用户,就像社区里的住户,只能在自己的 “家”(个人目录)里自由活动,想碰别人的东西或动社区公共设施,得看有没有权限。
你可以把用户想象成带着专属钥匙的人,钥匙能打开自己的门,但开不了邻居的门,更开不了社区的总闸 —— 除非被特别允许。
用户帐户主要有三种类型:
- superuser:用于管理系统,用户名称为root,UID为0,对系统具有完全访问权限。
- system users:系统具有系统用户帐户,由提供支持服务的进程使用。 这些进程或守护进程通常不需要以超级用户身份运行。 它们是非特权帐户,用户保护自己文件和其他资源。系统用户帐户不用于交互方式登录系统。
- regular users:大多数用户拥有常规用户帐户,用于日常工作。
passwd文件
/etc/passwd 文件保存操作系统登录用户信息。每行包含一个登录用户信息,以冒号分隔七个域。
-
name:用户登录名
-
password:用户密码,以x表示
-
UID:用户ID
-
GID:用户主组ID
-
GECOS:用户描述信息,通常为用户的真实姓名
-
directory:用户主目录,启动shell时的工作目录,默认位于/home/username
-
shell:用户打开终端时运行的程序,默认是shell。
对于system user,它的shell是/sbin/nologin
[yy1@centos7 ~ 12:46:37]$ grep postfix /etc/passwd postfix:x:89:89::/var/spool/postfix:/sbin/nologin
组(Group):就像社区里的 “兴趣小组” 或 “部门”
组是一群用户的 “集合”,也有自己的 ID(GID)。比如 “开发组” 里全是程序员,“设计组” 里都是设计师。组的好处是 “批量管理权限”:社区想让某个公共画室只对设计组开放,只要给设计组授权就行,不用一个个给组里的人单独开权限,就像给 “摄影协会” 发一把集体钥匙,协会里的人都能用。
一个用户可以加入多个组,就像一个人既能参加 “读书小组”,又能参加 “健身小组”,这样他就能同时拥有这两个小组的权限。而每个用户都有一个 “主组”(默认归属的组),就像人总有一个 “老家”,其他组都是 “暂住地”。
group 文件
/etc/group 文件保存操作系统组信息。每行包含一个组信息,以冒号分隔4个域
[yy1@centos7 ~ 12:49:07]$ grep wheel /etc/group
wheel:x:10:
- group_name:组名称
- password:组密码,用x表示
- GID:组ID,唯一表示组
- user_list:作为补充的成员
组的类型
在 Linux 系统中,用户与组的关系就像现实中 “家庭” 与 “俱乐部” 的组合。主要组是用户的 “户口本家庭”,从创建时就固定绑定,就像你出生就属于的那个家,文件创建时默认归属这个组;补充组则是 “兴趣俱乐部”,一个用户可以加入多个,让你获得额外权限,比如加入 “摄影组” 就能访问共享的照片库
- 主要组:用户创建的新文件组所有者为用户的主要组
主要组也叫私有组,每个用户必然属于且仅属于一个主要组。它就像用户的 “默认身份标签”,在用户创建时自动生成(通常与用户名相同),除非手动修改。
- 补充组
补充组是用户可以额外加入的组,一个用户能加入多个补充组,就像一个人可以同时参加多个俱乐部。它的作用是让用户获得更多权限,访问其他组的资源。
用户和组的关系:就像 “居民” 和 “社团” 的绑定
系统通过用户和组的搭配,牢牢掌控着 “谁能做什么”。比如一个文件像社区里的公告栏,只有 “管理员组” 能修改内容,“普通用户组” 只能看,“游客组” 连靠近都不行 —— 这背后就是用户所属的组在起作用
本地用户管理
whoami—查看终端中登录的用户
[root@centos7 ~ 10:43:27]# whoami
root
w和who—查看当前系统中终端上登录的用户,以及用户登录时间
[root@centos7 ~ 10:46:04]# w
10:47:00 up 14 min, 1 user, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
yy pts/0 10.1.8.1 10:32 4.00s 0.10s 0.16s sshd: yy [priv]
[root@centos7 ~ 10:43:35]# who
yy pts/0 2025-07-23 10:32 (10.1.8.1)
users—查看当前系统所有终端上登录的用户名
[root@centos7 ~ 10:44:20]# users
yy
useradd—创建用户
#用户1
[root@centos7 ~ 10:44:50]# useradd user01
[root@centos7 ~ 10:47:00]# id user01
uid=1001(user01) gid=1001(user01) 组=1001(user01)
[root@centos7 ~ 10:48:16]# grep user01 /etc/passwd
user01:x:1001:1001::/home/user01:/bin/bash
#用户2
[root@centos7 ~ 10:48:23]# useradd -u 8888 -d /opt/user02 -c "user for software manager" -g wheel -s /sbin/nologin user02
#系统会创建 user02 用户,其 UID 为 8888,家目录为 /opt/user02,属于 wheel 组,且不能登录系统,注释信息表明其用于软件管理。
[root@centos7 ~ 10:48:53]# id user02
uid=8888(user02) gid=10(wheel) 组=10(wheel)
[root@centos7 ~ 10:49:09]# grep user02 /etc/passwd
user02:x:8888:10:user for software manager:/opt/user02:/sbin/nologin
[root@centos7 ~ 10:49:27]# ls -d /opt/user02/
/opt/user02/
-u uid
-d 用户的家目录
-c 描述信息
-g 用户的主组
-s 用户的shell程序
root用户切换任何一个普通用户都不用密码
新用户家目录中的文件来源于 /etc/skel/
目录。
创建用户的时候,用户属性默认参数配置在 /etc/login.defs
文件。
usermod命令—修改用户属性
#使用户2正常登录且不设置密码
[root@centos7 ~ 10:55:16]# usermod -s /bin/bash user02
[root@centos7 ~ 10:55:47]# su - user02
上一次登录:三 7月 23 10:54:14 CST 2025pts/0 上
[root@centos7 ~ 10:56:28]# usermod -p '' user02
[root@centos7 ~ 10:56:51]# grep user02 /etc/passwd
user02:x:8888:10:user for software manager:/opt/user02:/bin/bash
对用户2修改用户属性
[root@centos7 ~ 11:21:36]# usermod user02 -u 1008 -md /home/user02 -s /bin/bash
# -m 移动家目录到新的位置
[root@centos7 ~ 11:21:42]# grep user02 /etc/passwd
user02:x:1008:10:user for software manager:/home/user02:/bin/bash
[root@centos7 ~ 11:22:04]# ls -d /home/user02
/home/user02
userdel命令
[root@centos7 ~ 11:23:28]# useradd user03
[root@centos7 ~ 11:23:44]# userdel user03
强制删除(尽量不要强制删除,要先找到无法删除的原因)
[root@centos7 ~ 11:43:43]# userdel -f user01
[root@centos7 ~ 11:49:46]# userdel -f user02
综合实例
#1 添加账户
[root@centos7 ~ 11:37:17]# vim /etc/passwd
# 最后一行添加如下内容
yy1:x:1002:1002::/home/yy1/bin/bash
# 2 添加组
[root@centos7 ~ 11:38:42]# vim /etc/group
# 最后一行添加如下内容
yy1:x:1002:
# 3 添加密码
[root@centos7 ~ 11:39:53]# vim /etc/shadow
# 最后一行添加如下内容
yy1:$6$FgUNKn74yoEDbcXD$pxDk9AEhsxkJGYi76Rv91zLy5LRns8olgAyGuNssQYG07ypaidhuX0gHAU4hrNi9Zp9A7vtMEvbyzCQ0e/gbk1::0:99999:7:::
# 4 准备家目录
[root@centos7 ~ 11:40:40]# cp -r /etc/skel/ /home/yy1
# 修改yy1家目录所属有zhangsan用户和组
[root@centos7 ~ 11:41:08]# chown yy1 -R /home/yy1
#登录
[root@centos7 ~ 11:41:36]# su - yy1
[yy1@centos7 ~ 11:41:52]$ ls /home
user01 user02 yy yy1
bash提示符变为初始字符
[root@centos7 ~ 12:02:55]# mv /etc/bashrc{,.ori}
bash-4.2#
bash-4.2#
bash-4.2#
恢复
bash-4.2# mv /etc/bashrc{.ori,}
bash-4.2# bash
[root@centos7 ~ 12:12:40]#
误删用户家目录
[root@centos7 ~ 12:12:40]# rm -fr /home/yy1
[root@centos7 ~ 12:44:57]# su - yy1
上一次登录:三 7月 23 12:00:21 CST 2025pts/0 上
su: 警告:无法更改到 /home/yy1 目录: 没有那个文件或目录
#解决
[root@centos7 ~ 12:45:57]# cp -r /etc/skel/ /home/yy1
[root@centos7 ~ 12:46:01]# chown yy1 -R /home/yy1[root@centos7 ~ 12:46:31]# su - yy1
上一次登录:三 7月 23 12:45:03 CST 2025pts/0
没有权限切换家目录
[yy1@centos7 ~ 12:53:04]$ chmod o=- /home/yy1
#解决
[yy1@centos7 ~ 12:53:49]$ chown -R yy1:yy1 /home/yy1
[yy1@centos7 ~ 12:54:21]$ chmod 700 /home/yy1
[yy1@centos7 ~ 12:54:27]$ ll -d /home/yy1
drwx------. 5 yy1 yy1 107 7月 23 12:46 /home/yy1
本地组管理
groupadd
# 创建名称为 admin 的组
[root@centos7 ~ 13:31:51]# groupadd admin
# 创建名称为sysadmin的组,组id为2000
[root@centos7 ~ 13:40:12]# groupadd admin1 -g 2000
[root@centos7 ~ 13:42:12]# grep admin /etc/group
printadmin:x:997:
admin:x:1003:
admin1:x:2000:
groupmod
# 修改组名称
[root@centos7 ~ 13:42:20]# groupmod --new-name admins admin
# 修改组id
[root@centos7 ~ 13:43:04]# groupmod -g 2002 admins
groupdel
[root@centos7 ~ 13:43:53]# grep admins /etc/group
admins:x:2002:
[root@centos7 ~ 13:44:08]# groupdel admin1
[root@centos7 ~ 13:44:28]# grep admin1 /etc/group
groupmem
# 添加成员
[root@centos7 ~ 13:45:03]# groupmems -g admins -a yy
[root@centos7 ~ 13:46:40]# groupmems -g admins -l
yy
[root@centos7 ~ 13:46:45]# id yy
uid=1000(yy) gid=1000(yy) 组=1000(yy),2002(admins)
# 删除成员
[root@centos7 ~ 13:46:50]# groupmems -g admins -d yy
[root@centos7 ~ 13:47:34]# groupmems -g admins -l
# 清空组中所有成员
[root@centos7 ~ 13:47:36]# groupmems -g admins -a yy
[root@centos7 ~ 13:48:00]# groupmems -g admins -p
管理用户密码
shadow文件
/etc/shadow** 文件保存操作系统登录用户密码信息。
每行包含一个登录用户信息,以冒号分隔九个域。
[root@centos7 ~ 14:09:36]# grep yy /etc/shadow
yy:$6$p3xYId44JVHwYhTv$L3UsmN.qQbW9fzrpef97grVOgCQ2lHu5Iqney85FpiCt2vWWtW6K5/0WxXpEcO30QDYF4HZ1kqc0B2x1fkayy/::0:99999:7:::
yy1:$6$p3xYId44JVHwYhTv$L3UsmN.qQbW9fzrpef97grVOgCQ2lHu5Iqney85FpiCt2vWWtW6K5/0WxXpEcO30QDYF4HZ1kqc0B2x1fkayy/::0:99999:7:::
- login name:用户登录名。
- encrypted password:加密的密码。
- date of last password change:上一次密码更改日期,以距离1970-1-1过去的天数表示。设置为0,强制用户下次登录时更改密码。
- minimum password age:最小密码生命周期。设置为0,密码可以随时更改。
- maximum password age:最大密码生命周期。
- password warning period:密码过期前,提前多少天告警。设置为0,不提示过期。
- password inactivity period:密码过期后,非活跃天数,在期间密码仍可以使用。
- account expiration date:账户过期时间,以距离1970-1-1过去的天数表示。
- reserved field:保留域。
chage
# 查看用户密码信息
[root@centos7 ~ 14:11:56]# chage -l yy
最近一次密码修改时间 :从不
密码过期时间 :从不
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :99999
在密码过期之前警告的天数 :7
# 修改用户密码要求
[root@centos7 ~ 14:12:21]# chage -M 100 yy
[root@centos7 ~ 14:12:53]# chage -l yy
最近一次密码修改时间 :从不
密码过期时间 :从不
密码失效时间 :从不
帐户过期时间 :从不
两次改变密码之间相距的最小天数 :0
两次改变密码之间相距的最大天数 :100
在密码过期之前警告的天数 :7
[root@centos7 ~ 14:15:13]# chage -m 10 yy
[root@centos7 ~ 14:15:28]# chage -d 0 yy
[root@centos7 ~ 14:15:39]# su - yy
上一次登录:三 7月 23 14:13:52 CST 2025pts/0 上
[yy@centos7 ~ 14:15:44]$ su - yy
密码:
您需要立即更改密码(root 强制)
# 设置用户密码过期时间是过去的一个时间,以便确保用户密码过期,登录时强制用户更改密码
usermod -p
#删除用户密码
[root@centos7 ~ 14:29:26]# usermod -p '' yy1
userod -s 限定用户shell
# 更改用户yyl为 /sbin/nologin
[root@centos7 ~ 14:30:24]# usermod -s /sbin/nologin yy1
[root@centos7 ~ 14:56:23]# su - yy1
上一次登录:三 7月 23 14:28:54 CST 2025pts/1 上
This account is currently not available.
# 将用户yy1改为/bin/bash
[root@centos7 ~ 14:57:04]# usermod -s /bin/bash yy1
[root@centos7 ~ 14:57:28]# su - yy1
上一次登录:三 7月 23 14:57:04 CST 2025pts/1 上
#usermod -L 锁定用户密码
#等效于` passwd -l`
[root@centos7 ~ 14:58:36]# usermod -L yy1
[yy1@centos7 ~ 14:59:25]$ su - yy1
密码:
su: 鉴定故障
# usermod -U 解锁用户密码
#等效于` passwd -u`
[root@centos7 ~ 15:00:26]# usermod -U yy1
[root@centos7 ~ 15:00:46]# su - yy1
上一次登录:三 7月 23 14:59:05 CST 2025pts/1 上
#passwd -d 删除密码
[root@centos7 ~ 15:01:27]# passwd -d yy1
清除用户的密码 yy1。
passwd: 操作成功
#增加一个 uid 为 0 的用户
[root@centos7 ~ 15:02:59]# vim /etc/passwd
[root@centos7 ~ 15:04:17]# id yy
uid=0(root) gid=0(root) 组=0(root)
[root@centos7 ~ 15:09:50]# usermod -o -u 1000 yy
#设置/sbin/mynologi与/sbin/nologin 一样
[root@centos7 ~ 15:13:21]# cp /sbin/nologin /sbin/mynologin
[root@centos7 ~ 15:16:05]# echo "echo 'This account is currently not available.'" > /sbin/mynologin
[root@centos7 ~ 15:16:15]# cat /sbin/mynologin
echo 'This account is currently not available.'
[root@centos7 ~ 15:16:28]# /sbin/mynologin
This account is currently not available.
[root@centos7 ~ 15:16:51]# /sbin/nologin
This account is currently not available.
linux提权管理
su
- 示例1:
su username
启动一个非登录shell,使用当前的环境设置 - 示例2:
su - username
启动一个登录shell,设置了shell环境
[yy@centos7 ~ 15:55:44]$ su
密码:
# 很多环境变量仍保留为yy用户
[root@centos7 yy 15:56:18]# set |grep yy
HOSTNAME=centos7.yy.cloud
LOGNAME=yy
MAIL=/var/spool/mail/yy
PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/yy/.local/bin:/home/yy/bin
PWD=/home/yy
USER=yy
XDG_DATA_DIRS=/home/yy/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
[root@centos7 yy 15:56:28]# su -
上一次登录:三 7月 23 15:55:58 CST 2025pts/0 上
# 所有环境变量都更改为了root用户
[root@centos7 ~ 15:57:09]# set | grep yy
HOSTNAME=centos7.yy.cloud
#准备一个用户为yy1
# 以特定用户身份执行特定命令
[yy@centos7 ~ 15:58:31]$ su -l yy1 -c 'cat /etc/hosts'
密码:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
#不加单引号
[yy@centos7 ~ 16:02:36]$ su -l yy1 -c cat /etc/hosts
密码:
hh
hh
hhh
hhh
C^H^C
Session terminated, killing shell... ...已杀死。
# 原因:没有把 "cat /etc/hosts" 当作整体
[yy@centos7 ~ 16:03:05]$ su -
密码:
上一次登录:三 7月 23 15:57:09 CST 2025pts/0 上
[root@centos7 ~ 16:04:34]# su -l -c 'touch haha' yy
# 切换 nologin shell 账户
[root@centos7 ~ 16:04:57]# grep adm /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@centos7 ~ 16:05:54]# su -l adm -c id
This account is currently not available.
[root@centos7 ~ 16:06:15]# su -l adm -s /bin/bash -c id
uid=3(adm) gid=4(adm) 组=4(adm) 环境
=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
# 只有 root 用户可以指定 shell
[root@centos7 ~ 16:06:46]# su -l adm -s /bin/bash
上一次登录:三 7月 23 16:06:46 CST 2025pts/0 上
-bash-4.2$
# 提示符不正常,原因是家目录中缺少bash相关配置文件
# 处理方法如下:
[root@centos7 ~ 16:18:06]# grep adm /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@centos7 ~ 16:17:37]# cp /etc/skel/{.bash_profile,.bashrc} /var/adm
[root@centos7 ~ 16:17:52]# su adm -l -s /bin/bash
上一次登录:三 7月 23 16:16:32 CST 2025pts/0 上
sudo
授予特定用户以root身份执行系统管理命令
- su 缺点:
- 用户必须知道 root 用户密码获取 root 用户所有权限。
- 未记录用户执行命令。
- 无法以
/sbin/nologin
的用户身份运行命令。
- sudo 优点:
- sudo 允许用户以其他用户身份执行特定命令。
- sudo 需要用户输入用户自己的密码,而非他们想访问的用户密码。
- sudo 执行的命令会记录在
/var/log/secure
文件中。
sudo 语法:sudo [-u username] command
[yy1@centos7 ~ 16:37:33]$ sudo id
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] yy1 的密码:
yy1 不在 sudoers 文件中。此事将被报告。
[root@centos7 ~ 16:15:02]# export EDITOR=vim
[root@centos7 ~ 16:36:15]# visudo
#赋予执行权限
yy1 ALL=(ALL) ALL
[yy1@centos7 ~ 16:38:00]$ sudo id
[sudo] yy1 的密码:
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[yy1@centos7 ~ 16:38:06]$
#不需要密码执行命令
yy1 ALL=(ALL) NOPASSWD:ALL
[yy1@centos7 ~ 16:38:06]$ sudo id
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
#赋予用户管理权限
yy1 ALL=(ALL) /sbin/useradd,/sbin/usermod,/sbin/userdel
[yy1@centos7 ~ 16:49:52]$ sudo useradd yy2
[sudo] yy1 的密码:
[yy1@centos7 ~ 16:50:06]$ id yy2
uid=1003(yy2) gid=1003(yy2) 组=1003(yy2)
visudo支持sudo配置规则语法检查
**总结:**在分配命令的时候,切记:只给用户特定功能的命令(例如用户管理相关命令),而不是通用功能的工具(例如 vim)
配置文件路径:
- 主配置文件:
/etc/sudoers
,正常情况不要修改。 - 从配置文件:
/etc/sudoer.d/*
,如果想添加配置,在此处添加。
[root@centos7 ~ 17:14:18]# echo 'yy1 ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers.d/yy1
[root@centos7 ~ 17:16:25]# cat /etc/sudoers.d/yy1
yy1 ALL=(ALL) NOPASSWD:ALL
[yy1@centos7 ~ 17:10:21]$ sudo id
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
案例
- 配置用户xiaoniuma可以以root身份运行vim命令
- 用户 xiaoniuma 将自己提权为 root 用户
- 方法一:将uid该为0
- 方法二:将sudo规则中vim程序改为bash或者ALL
[root@centos7 ~ 17:18:21]# useradd xiao
[root@centos7 ~ 17:19:07]# echo 123 | passwd --stdin xiao
更改用户 xiao 的密码 。
passwd:所有的身份验证令牌已经成功更新。
[root@centos7 ~ 17:19:24]# echo 'xiao ALL=(ALL) /bin/vim' > /etc/sudoers.d/xiao
#看效果
[xiao@centos7 ~ 17:20:25]$ sudo vim /etc/passwd
#修改 xiao 的 UID 为0
xiao:x:0:1001::/home/xiao:/bin/bash
[xiao@centos7 ~ 17:21:40]$ su - xiao
密码:
上一次登录:三 7月 23 16:04:33 CST 2025pts/0 上
[root@centos7 ~ 17:21:57]#
还原环境
[root@centos7 ~ 17:24:31]# sudo vim /etc/passwd
xiao:x:1004:1004::/home/xiao:/bin/bash
[root@centos7 ~ 17:26:36]# userdel -r xiao
[root@centos7 ~ 17:26:46]# rm -f /etc/suders.d/xiao