引言
账号管理与权限管控是服务器安全的第一道防线,不少人日常运维习惯直接 su 切换 root,存在密码泄露、环境变量错乱等安全隐患。本篇基于 CentOS7 实操,覆盖用户 / 组增删改查、密码过期配置、sudo 精细化授权,附带登录报错排错案例,清晰区分 su 登录 shell 与 sudo 临时提权的差异,整理生产环境可用的权限操作规范。
Linux 用户和组管理
用户和组介绍
用户介绍
用户帐户是系统安全的基础。 系统上的每个进程(运行程序)都以特定用户身份运行。 每个文件都有一个特定用户作为其所有者。 文件所有权有助于系统对文件用户实施访问控制。正在运行的进程关联的用户确定该进程可访问的文件和目录。用户使用username标识并使其更易于使用。在内部,系统通过分配给它们的唯一标识号,用户ID或UID来区分用户帐户。 如果用户使用用户帐户,则通常会为其分配一个密码,用户在登录时将使用该密码来证明他们是实际的授权用户。
用户帐户主要有三种类型:
- superuser:用于管理系统,用户名称为root,UID为0,对系统具有完全访问权限。
- system users:系统具有系统用户帐户,由提供支持服务的进程使用。 这些进程或守护进程通常不需要以超级用户身份运行。 它们是非特权帐户,用户保护自己文件和其他资源。系统用户帐户不用于交互方式登录系统。
- regular users:大多数用户拥有常规用户帐户,用于日常工作。
passwd 文件
/etc/passwd 文件保存操作系统登录用户信息。每行包含一个登录用户信息,以冒号分隔七个域。
格式:
- name:password:UID:GID:GECOS:directory:shell
复制代码
示例:
- [root@centos7 ~ 16:03:08]# grep yy /etc/passwd
- yy:x:1000:1000:yy:/home/yy:/bin/bash
复制代码
解释如下:
- name:用户登录名
- password:用户密码,以x表示
- UID:用户ID
- GID:用户主组ID
- GECOS:用户描述信息,通常为用户的真实姓名
- directory:用户主目录,启动shell时的工作目录,默认位于/home/username
- shell:用户打开终端时运行的程序,默认是shell。
对于system user,它的shell是/sbin/nologin。
示例:
- [yy@centos7 ~ 16:48:32]$ grep postfix /etc/passwd
- postfix:x:89:89::/var/spool/postfix:/sbin/nologin
复制代码
group 文件
**组是用户的集合,组中用户继承组权限。**与用户一样,组具有组名称以使其更易于使用。系统通过分配给它们的唯一标识号,组ID或GID来区分组。
/etc/group 文件保存操作系统组信息。每行包含一个组信息,以冒号分隔4个域。格式:
- group_name:password:GID:user_list
复制代码
示例:
- [yy@centos7 ~ 16:48:50]$ grep wheel /etc/group
- wheel:x:10:
复制代码
解释如下:
- group_name:组名称
- password:组密码,用x表示
- GID:组ID,唯一表示组
- user_list:作为补充的成员
组的类型
- 主要组:每个用户只有一个主要组,/etc/passwd 文件中的GID编号定义。 默认情况下,**用户创建的新文件组所有者为用户的主要组。**通常,在创建新的常规用户时,会创建一个与该用户同名的新组。该组用作新用户的主要组,该用户是此用户专用组的唯一成员,有助于简化文件权限管理。
- 补充组:用户还可以拥有补充组。 补充组的成员资格由/etc/group文件确定。 根据用户的任何组是否具有访问权限,授予用户访问权限的权限。例如,如果用户user01具有主要组user01和补充组wheel和webadmin,则该用户可以读取这三个组中任何一个组可读的文件。
- # 查看用户信息
- [yy@centos7 ~ 16:49:19]$ id
- uid=1000(yy) gid=1000(yy) groups=1000(yy) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
- # 查看用户 uid
- [yy@centos7 ~ 16:49:42]$ id -u yy
- 1000
复制代码
练习
- 哪一项表示在最基本的层面上标识用户的编号? a. 主要用户 b. UID c. GID d. 用户名
- 哪一项表示提供用户命令行提示符的程序? a. 主 shell b. 主目录 c. 登录 shell d. 命令名称
- 哪一项目或文件表示本地组信息的位置? a. 主目录 b. /etc/passwd c. /etc/GID d. /etc/group
- 哪一项目或文件表示用户个人文件的位置? a. 主目录 b. 登录 shell c. /etc/passwd d. /etc/group
- 哪一项表示在最基本的层面上标识组的编号? a. 主要组 b. UID c. GID d. groupid
- 哪一项目或文件表示本地用户帐户信息的位置? a. 主目录 b. /etc/passwd c. /etc/UID d. /etc/group
- /etc/passwd 文件的第四个字段是什么? a. 主目录 b. UID c. 登录 shell d. 主要组
本地用户管理
whoami 命令
查看当前终端中登录的用户。
- [root@centos7 ~ 16:50:41]# whoami
- root
复制代码
who 和 w 命令
查看当前系统中所有终端上登录的用户,以及用户登录的时间。
- [yy@centos7 ~ 16:49:48]$ who
- yy :0 2026-07-17 13:31 (:0)
- yy pts/0 2026-07-17 16:48 (10.1.8.1)
- yy pts/1 2026-07-17 16:50 (10.1.8.1)
- [yy@centos7 ~ 16:50:59]$ w
- 16:51:02 up 5:09, 3 users, load average: 0.00, 0.01, 0.05
- USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
- yy :0 :0 13:31 ?xdm? 1:54 0.17s /usr/libexec/gnome-session-binary --session gnome-cla
- yy pts/0 10.1.8.1 16:48 6.00s 0.05s 0.00s w
- yy pts/1 10.1.8.1 16:50 22.00s 0.06s 0.18s sshd: yy [priv]
复制代码
users 命令
查看当前系统中所有终端上登录的用户名。
- [root@centos7 ~ 16:50:46]# users
- yy yy yy
复制代码
useradd 命令
作用:创建用户
- # 用户1
- [root@centos7 ~ 16:51:25]# useradd user01
- [root@centos7 ~ 16:52:11]# grep user01 /etc/passwd
- user01:x:1001:1001::/home/user01:/bin/bash
- # 用户2
- [root@centos7 ~ 16:52:24]# useradd -u 8888 -d /opt/user02 -c "user for software manage" -g wheel -s /sbin/nologin user02
- # -u uid
- # -d 用户的家目录
- # -c 描述信息
- # -g 用户的主组
- # -s 用户shell程序
- [root@centos7 ~ 16:53:11]# grep user02 /etc/passwd
- user02:x:8888:10:user for software manage:/opt/user02:/sbin/nologin
- [root@centos7 ~ 16:53:30]# ls -d /opt/user02
- /opt/user02
- # 创建一个没有密码的账户,该用户在图形化界面中可以直接登录
- [root@centos7 ~ 16:53:41]# useradd -p '' tom
复制代码
新用户家目录中的文件来源于 /etc/skel/ 目录。
- [root@centos7 ~ 16:54:21]# ls -a ~tom
- . .. .bash_logout .bash_profile .bashrc .mozilla
- [root@centos7 ~ 16:54:59]# ls -a /etc/skel/
- . .. .bash_logout .bash_profile .bashrc .mozilla
复制代码
创建用户的时候,用户属性默认参数配置在 /etc/login.defs 文件。
- [root@centos7 ~ 16:55:10]# vim /etc/login.defs
- #
- # Please note that the parameters in this configuration file control the
- # behavior of the tools from the shadow-utils component. None of these
- # tools uses the PAM mechanism, and the utilities that use PAM (such as the
- # passwd command) should therefore be configured elsewhere. Refer to
- # /etc/pam.d/system-auth for more information.
- #
- # *REQUIRED*
- # Directory where mailboxes reside, _or_ name of file, relative to the
- # home directory. If you _do_ define both, MAIL_DIR takes precedence.
- # QMAIL_DIR is for Qmail
- #
- #QMAIL_DIR Maildir
- MAIL_DIR /var/spool/mail
- #MAIL_FILE .mail
- # Password aging controls:
- #
- # PASS_MAX_DAYS Maximum number of days a password may be used.
- # PASS_MIN_DAYS Minimum number of days allowed between password changes.
- # PASS_MIN_LEN Minimum acceptable password length.
- # PASS_WARN_AGE Number of days warning given before a password expires.
- #
- PASS_MAX_DAYS 99999
- PASS_MIN_DAYS 0
- PASS_MIN_LEN 5
- PASS_WARN_AGE 7
- #
- # Min/max values for automatic uid selection in useradd
- #
- UID_MIN 1000
- UID_MAX 60000
- # System accounts
- SYS_UID_MIN 201
- SYS_UID_MAX 999
- #
- # Min/max values for automatic gid selection in groupadd
- #
- GID_MIN 1000
- GID_MAX 60000
- # System accounts
- SYS_GID_MIN 201
- SYS_GID_MAX 999
- #
- # If defined, this command is run when removing a user.
- # It should remove any at/cron/print jobs etc. owned by
- # the user to be removed (passed as the first argument).
- #
- #USERDEL_CMD /usr/sbin/userdel_local
- #
- # If useradd should create home directories for users by default
- # On RH systems, we do. This option is overridden with the -m flag on
- # useradd command line.
- #
- CREATE_HOME yes
- # The permission mask is initialized to this value. If not specified,
- # the permission mask will be initialized to 022.
- UMASK 077
- # This enables userdel to remove user groups if no members exist.
- #
- USERGROUPS_ENAB yes
- # Use SHA512 to encrypt password.
- ENCRYPT_METHOD SHA512
复制代码
usermod 命令
作用:修改用户属性。
- [root@centos7 ~ 16:57:05]# usermod user02 -u 1008 -md /home/user02 -s /bin/bash
- # -m 移动家目录到新的位置
- [root@centos7 ~ 16:57:32]# grep user02 /etc/passwd
- user02:x:1008:10:user for software manage:/home/user02:/bin/bash
- [root@centos7 ~ 16:57:40]# ls -d /home/user02/
- /home/user02/
- [root@centos7 ~ 16:57:45]# su - user02
- [user02@centos7 ~ 16:57:51]$
- # 添加补充组,如果没有-a选项,则代表将补充组设置为user01,原先的补充组就被覆盖了。
- [root@centos7 ~ 16:59:02]# usermod -aG user01 user02
- [root@centos7 ~ 16:59:06]# id user02
- uid=1008(user02) gid=10(wheel) groups=10(wheel),1001(user01)
复制代码
userdel 命令
- # 正常删除
- [root@centos7 ~ 16:59:11]# useradd user03
- [root@centos7 ~ 16:59:36]# userdel user03
- # 强制删除
- [root@centos7 ~ 17:01:33]# userdel user02
- userdel: user user02 is currently used by process 9071
- [root@centos7 ~ 17:02:09]# id user02
- uid=1008(user02) gid=10(wheel) groups=10(wheel),1003(user01)
- # 尽量不要强制删除,要找到无法删除的原因
- [root@centos7 ~ 17:02:09]# userdel -f user02
- userdel: user user02 is currently used by process 9071
- [root@centos7 ~ 17:02:50]# id user02
- id: user02: no such user
复制代码
课后作业
- 创建 operator1 用户
- useradd -p '' zhangsan
- # 添加zhangsan用户并设置空密码
复制代码
- 使用 id 验证 operator1 用户信息
- 查看 /etc/passwd 中对应条目
- 密码设置为 redhat
- 修改 operator1 用户uid为1088
- 修改 operator1 用户描述信息为"Operator One"
- 将 wheel 组作为补充组添加给 operator1 用户
- 查看 /etc/group 中对应条目
- 删除 operator1 用户
- [root@centos7 ~ 09:14:30]# useradd operator1
- 正在创建信箱文件: 文件已存在
- [root@centos7 ~ 09:16:03]# id operator1
- uid=8890(operator1) gid=8890(operator1) 组=8890(operator1)
- [root@centos7 ~ 09:16:40]# grep operator1 /etc/passwd
- operator1:x:8890:8890::/home/operator1:/bin/bash
- [root@centos7 ~ 09:16:59]# passwd operator1
- 更改用户 operator1 的密码 。
- 新的 密码:
- 无效的密码: 密码少于 8 个字符
- 重新输入新的 密码:
- passwd:所有的身份验证令牌已经成功更新。
- [root@centos7 ~ 09:17:28]# usermod -u 1088 operator1
- usermod:警告:/var/spool/mail/operator1 不属于 operator1
- [root@centos7 ~ 09:17:59]# usermod -c "Operator One" operator1
- [root@centos7 ~ 09:18:20]# usermod -aG wheel operator1
- [root@centos7 ~ 09:19:38]# grep operator1 /etc/passwd
- operator1:x:1088:8890:Operator One:/home/operator1:/bin/bash
- [root@centos7 ~ 09:19:42]# grep wheel /etc/group
- wheel:x:10:operator1
- [root@centos7 ~ 09:20:29]# grep operttor1 /etc/group
- [root@centos7 ~ 09:20:49]# userdel operator1
- [root@centos7 ~ 09:21:11]# rm -fr /home/operator1
- [root@centos7 ~ 09:21:24]# ls /var/spool/mail
- operator1 root rpc tom user01 user02 user03 yy
- [root@centos7 ~ 09:21:37]# ls /var/spool/mail/
- operator1 root rpc tom user01 user02 user03 yy
- [root@centos7 ~ 09:21:40]# ls /var/spool/mail/operator1
- /var/spool/mail/operator1
- [root@centos7 ~ 09:21:52]# rm -fr /var/spool/mail/operator1
复制代码
综合案
手动创建一个用户
- # 1 添加账户
- [root@centos7 ~ 17:03:02]# vim /etc/passwd
- # 最后一行添加如下内容,注意uid要在原有的基础上增加1
- zhangsan:x:1002:1002::/home/zhangsan:/bin/bash
- # 2 添加组
- [root@centos7 ~ 17:05:15]# vim /etc/group
- # 最后一行添加如下内容
- zhangsan:x:1002:
- # 3 添加密码
- [root@centos7 ~ 17:05:15]# vim /etc/shadow
- # 最后一行添加如下内容
- zhangsan:$6$FgUNKn74yoEDbcXD$pxDk9AEhsxkJGYi76Rv91zLy5LRns8olgAyGuNssQYG07ypaidhuX0gHAU4hrNi9Zp9A7vtMEvbyzCQ0e/gbk1::0:99999:7:::
- # 4 准备家目录
- [root@centos7 ~ 17:13:16]# cp -r /etc/skel/ /home/zhangsan
- # 修改zhangsan家目录所属有zhangsan用户和组
- [root@centos7 ~ 17:13:27]# chown zhangsan:zhangsan /home/zhangsan
- [root@centos7 ~ 17:13:33]# ll -d /home/zhangsan
- drwxr-xr-x. 3 zhangsan zhangsan 78 Jul 17 17:13 /home/zhangsan
- # 测试
- [root@centos7 ~ 17:13:37]# ssh zhangsan@localhost
复制代码
bash 提示符变为初始字符
提示符如下: bash-4.2$
模拟:
- [root@centos7 ~ 17:14:43]# mv /etc/bashrc{,.ori}
- [root@centos7 ~ 17:15:17]# bash
- bash-4.2#
复制代码
原因:nologin shell打开的时候执行 /etc/bashrc 配置。
恢复:
- bash-4.2# mv /etc/bashrc{.ori,}
- bash-4.2# bash
- [root@centos7 ~ 17:16:48]#
复制代码
误删用户家目录
故障:
- [root@centos7 ~ 17:21:29]# ssh zhangsan@localhost
- zhangsan@localhost's password:
- Activate the web console with: systemctl enable --now cockpit.socket
- Last login: Fri Jul 19 14:13:47 2024 from ::1
- Could not chdir to home directory /home/zhangsan: No such file or directory
- -bash-4.2$
复制代码
模拟:
- [root@centos7 ~ 17:21:40]$ rm -fr /home/zhangsan
复制代码
解决
- [root@centos7 ~ 17:22:20]$ cp -r /etc/skel/ /home/zhangsan
- [root@centos7 ~ 17:22:44]$ chown zhangsan:zhangsan /home/zhangsan
复制代码
没有权限切换家目录
故障
- Could not chdir to home directory /home/zhangsan: Permission denied
- -bash: /home/zhangsan/.bash_profile: 权限不够
复制代码
模拟
- [root@centos7 ~ 17:24:55]# chmod u=- /home/zhangsan
复制代码
解决
- [root@centos7 ~ 17:25:32]# chown -R zhangsan:zhangsan /home/zhangsan
- [root@centos7 ~ 17:26:07]# chmod u=rwx /home/zhangsan
- [root@centos7 ~ 17:26:30]# ll -d /home/zhangsan
- drwxr-xr-x. 4 zhangsan zhangsan 55 Jul 17 17:24 /home/zhangsan
复制代码
本地组管理
groupadd 命令
- # 创建名称为 admin 的组
- [root@centos7 ~ 10:24:38]# groupadd admin
- # 创建名称为sysadmin的组,组id为2000
- [root@centos7 ~ 10:24:57]# groupadd sysadmin -g 2000
- # 验证
- [root@centos7 ~ 10:25:13]# grep admin /etc/group
- printadmin:x:997:
- admin:x:1004:
- sysadmin:x:2000:
复制代码
groupmod 命令
- # 修改组名称
- [root@centos7 ~ 10:25:36]# groupmod --new-name admins admin
- # 修改组id
- [root@centos7 ~ 10:25:58]# groupmod -g 2002 admins
- # 验证
- [root@centos7 ~ 10:26:12]# grep 'admins' /etc/group
- admins:x:2002:
复制代码
groupdel 命令
- [root@centos7 ~ 10:26:27]# groupdel sysadmin
- [root@centos7 ~ 10:26:44]# grep sysadmin /etc/group
复制代码
groupmem 命令
- [root@centos7 ~ 10:30:09]# groupmems --help
- Usage: groupmems [options] [action]
- Options:
- -g, --group groupname change groupname instead of the user's group
- (root only)
- -R, --root CHROOT_DIR directory to chroot into
- Actions:
- -a, --add username add username to the members of the group
- -d, --delete username remove username from the members of the group
- -h, --help display this help message and exit
- -p, --purge purge all members from the group
- -l, --list list the members of the group
- # 添加成员
- [root@centos7 ~ 10:26:54]# groupmems -g admins -a yy
- [root@centos7 ~ 10:27:13]# groupmems -g admins -l
- yy
- [root@centos7 ~ 10:27:17]# id yy
- uid=1000(yy) gid=1000(yy) groups=1000(yy),2002(admins)
- # 删除成员
- [root@centos7 ~ 10:27:21]# groupmems -g admins -d yy
- [root@centos7 ~ 10:27:33]# groupmems -g admins -l
- # 清空组中所有成员
- [root@centos7 ~ 10:27:36]# groupmems -g admins -a yy
- [root@centos7 ~ 10:27:44]# groupmems -g admins -p
复制代码
练习
- 创建developer组,组id为2000
- 修改developer组名称为developers,组id为3000
- 创建developer1用户,并添加到组developers
- 将developer1用户从组developers中删除
- 删除组developers
- # 创建组并设置组id为2000
- [root@centos7 ~ 09:49:44]# groupadd developer -g 2000
- [root@centos7 ~ 10:17:16]# grep developer /etc/group
- developer:x:2000:
- # 修改组名称和组id
- [root@centos7 ~ 10:17:52]# groupmod --new-name developers developer
- [root@centos7 ~ 10:18:36]# groupmod -g 3000 developers
- [root@centos7 ~ 10:19:02]# grep 'developers' /etc/group
- developers:x:3000:
- # 创建developer1用户,并添加到组developers
- [root@centos7 ~ 10:20:39]# useradd developer1
- [root@centos7 ~ 10:20:51]# groupmems -g developers -a developer1
- [root@centos7 ~ 10:20:52]# grep 'developers' /etc/group
- developers:x:3000:developer1
- # 删除组developers中developer1用户
- [root@centos7 ~ 10:21:08]# groupmems -g developers -d developer1
- # 列出组内所有成员
- [root@centos7 ~ 10:21:36]# groupmems -g developers -l
- [root@centos7 ~ 10:21:45]# grep 'developers' /etc/group
- developers:x:3000:
- # 清空该组内所有附加用户
- [root@centos7 ~ 10:23:52]# groupmems -g developers -p
- # 删除组developers
- [root@centos7 ~ 10:23:58]# groupdel developers
- [root@centos7 ~ 10:24:14]# grep 'developers' /etc/group
复制代码
管理用户密码
shadow 文件
/etc/shadow 文件保存操作系统登录用户密码信息。
每行包含一个登录用户信息,以冒号分隔九个域。
示例:
- [root@centos7 ~ 10:41:39]# grep yy /etc/shadow
- yy:$6$FUDbUl5r4iDyUEgp$nvRxXlYweIKzDnbleUSpuz0yMNDEb/lH7VNoZo7rKu8AqQD6HncMngOlylcHzIltCycoq.x9Ld6cWZOwQnmQB/::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 ~ 11:24:38]# chage -l yy
- 最近一次密码修改时间 :从不
- 密码过期时间 :从不
- 密码失效时间 :从不
- 帐户过期时间 :从不
- 两次改变密码之间相距的最小天数 :0
- 两次改变密码之间相距的最大天数 :99999
- 在密码过期之前警告的天数 :7
- # 修改用户密码要求
- # 修改两次更改密码间隔最大天数
- [root@centos7 ~ 11:24:51]# chage -M 100 yy
- [root@centos7 ~ 11:25:15]# chage -l yy
- 最近一次密码修改时间 :从不
- 密码过期时间 :从不
- 密码失效时间 :从不
- 帐户过期时间 :从不
- 两次改变密码之间相距的最小天数 :0
- 两次改变密码之间相距的最大天数 :100
- 在密码过期之前警告的天数 :7
- # 修改两次更改密码间隔最小天数
- [root@centos7 ~ 11:25:23]# chage -m 10 yy
- [root@centos7 ~ 11:25:45]# chage -l yy
- 最近一次密码修改时间 :从不
- 密码过期时间 :从不
- 密码失效时间 :从不
- 帐户过期时间 :从不
- 两次改变密码之间相距的最小天数 :10
- 两次改变密码之间相距的最大天数 :100
- 在密码过期之前警告的天数 :7
- #设置用户yy下次登录时必须修改密码
- [root@centos7 ~ 11:25:51]# chage -d 0 yy
- [root@centos7 ~ 11:27:54]# chage -l yy
- 最近一次密码修改时间 :密码必须更改
- 密码过期时间 :密码必须更改
- 密码失效时间 :密码必须更改
- 帐户过期时间 :从不
- 两次改变密码之间相距的最小天数 :10
- 两次改变密码之间相距的最大天数 :100
- 在密码过期之前警告的天数 :7
- # 验证 (登录时必须重新更改密码)
- [root@centos7 ~ 11:32:01]# ssh yy@localhost
- yy@localhost's password:
- You are required to change your password immediately (root enforced)
- Last login: Sat Jul 18 11:31:50 2026 from localhost
- WARNING: Your password has expired.
- You must change your password now and login again!
- 更改用户 yy 的密码 。
- 为 yy 更改 STRESS 密码。
- (当前)UNIX 密码:
- # 设置用户密码过期时间是过去的一个时间,以便确保用户密码过期,登录时强制用户更改密码
- # 将 yy 用户上次修改密码的日期设为纪元第 1 天,不会强制登录改密,仅改变密码计时起始点
- [root@centos7 ~ 11:33:06]# chage -d 1 yy
- [root@centos7 ~ 11:33:26]# chage -l yy
- 最近一次密码修改时间 :1月 02, 1970
- 密码过期时间 :4月 12, 1970
- 密码失效时间 :从不
- 帐户过期时间 :从不
- 两次改变密码之间相距的最小天数 :10
- 两次改变密码之间相距的最大天数 :100
- 在密码过期之前警告的天数 :7
- # 设置用户账户过期时间是过去的一个时间,以便锁定用户账户
- [root@centos7 ~ 11:33:40]# chage -E 1970-1-1 yy
- [root@centos7 ~ 11:34:41]# chage -l yy
- 最近一次密码修改时间 :1月 02, 1970
- 密码过期时间 :4月 12, 1970
- 密码失效时间 :从不
- 帐户过期时间 :1月 01, 1970
- 两次改变密码之间相距的最小天数 :10
- 两次改变密码之间相距的最大天数 :100
- 在密码过期之前警告的天数 :7
复制代码
usermod -p 更改用户密码
- # 更改yin的密码与yy一致
- [root@centos7 ~ 18:48:36]# grep yin /etc/shadow
- yin::20652:0:99999:7::19922:
- [root@centos7 ~ 17:00:02]# usermod -p '$6$61vYLp0B$/TeDdIhzMHrE6Z6LkBco8E0UzwdsdSr6d3dcJWS1Qn0F3yGFIgS/H.RadP59K7gKmigDaZqtVIxzvWzdIWps61' yy
- # 删除用户密码
- [root@centos7 ~ 17:01:58]# usermod -p '' yy
复制代码
usermod -s 限定用户shell
- # 默认情况下,root用户可以切换到任何用户而且不需要密码
- [root@centos7 ~ 17:07:47]# su - yin
- 上一次登录:六 7月 18 17:06:04 CST 2026pts/1 上
- [yin@centos7 ~ 17:07:55]$ 登出
- # 更改用户shell为 /sbin/nologin
- [root@centos7 ~ 17:08:18]# usermod -s /sbin/nologin yin
- [root@centos7 ~ 17:08:41]# su - yin
- 上一次登录:六 7月 18 17:07:55 CST 2026pts/1 上
- This account is currently not available.
- # 将用户shell改为/bin/bash
- [root@centos7 ~ 17:08:47]# usermod -s /bin/bash yin
复制代码
usermod -L 锁定用户密码
等效于passwd -l
- [root@centos7 ~ 17:09:01]# usermod -L yin
- # 输入正确的密码也无法登录
- [yy@centos7 ~ 17:10:34]$ su - yin
- 密码:
- su: 鉴定故障
- [yy@centos7 ~ 17:10:46]$
复制代码
usermod -U 解锁用户密码
等效于passwd -u
- [root@centos7 ~ 17:11:11]# usermod -U yin
- # 输入正确的密码登录
- [root@centos7 ~ 17:11:35]# 登出
- [yy@centos7 ~ 17:11:37]$ su - yin
- 密码:
- 上一次登录:六 7月 18 17:10:28 CST 2026pts/1 上
- 最后一次失败的登录:六 7月 18 17:10:45 CST 2026pts/1 上
- 最有一次成功登录后有 1 次失败的登录尝试。
- [yin@centos7 ~ 17:11:48]$
复制代码
passwd -d 删除密码
- # 删除用户密码即可
- [root@centos7 ~ 17:12:22]# passwd -d yin
- 清除用户的密码 yin。
- passwd: 操作成功
复制代码
用户登录的时候,输入用户名即可登录。
设置账户过期
等效于passwd -e
- # 设置账户过期时间为过去的某一个日期
- [root@centos7 ~ 17:12:34]# usermod -e 2024-7-18 yin
- # 或者
- [root@centos7 ~ 17:18:17]# chage -E 2024-7-18 yin
复制代码
增加一个 uid 为 0 的用户
方法一
- [root@centos7 ~ 17:18:30]# vim /etc/passwd
- # 将自己的用户id该为0,此时laoma用户可以行使root权限了
- yin:x:0:1001::/home/yin:/bin/bash
复制代码
方法二
- [root@centos7 ~ 17:20:40]# useradd -o -u 0 jeong
- [root@centos7 ~ 17:20:58]# id jeong
- uid=0(root) gid=0(root) 组=0(root)
复制代码
laoma 和 root 账户是两个不同的账户,但是laoma用户获得了root账户权限。
其他 shell
- # 查看系统中 shell 清单
- [root@centos7 ~ 17:21:01]# cat /etc/shells
- /bin/sh
- /bin/bash
- /usr/bin/sh
- /usr/bin/bash
- /bin/tcsh
- /bin/csh
- [root@centos7 ~ 17:21:48]# ll /bin/sh /usr/bin/sh
- lrwxrwxrwx. 1 root root 4 7月 14 10:27 /bin/sh -> bash
- lrwxrwxrwx. 1 root root 4 7月 14 10:27 /usr/bin/sh -> bash
- # 新增 tmux shell
- [root@centos7 ~ 17:22:05]# yum install -y tmux
- 已加载插件:fastestmirror, langpacks
- # 新增 c shell
- [root@centos7 ~ 17:22:16]# yum install -y tcsh
- [root@centos7 ~ 17:23:02]# ll /bin/csh /usr/bin/csh
- lrwxrwxrwx. 1 root root 4 7月 14 10:29 /bin/csh -> tcsh
- lrwxrwxrwx. 1 root root 4 7月 14 10:29 /usr/bin/csh -> tcsh
复制代码
tmux 控制键 ctrl+b:
- c,新建一个会话
- N,切换到N号会话,例如数字1,切换到1号会话。
Linux 提权管理
大多数时候Linux系统管理员以非特权用户身份登录系统,并使用工具暂时获得特权用户root管理系统。
su 命令
- 示例1:su username 启动一个非登录shell,使用当前的环境设置(上一个用户)
- 示例2:su -l username 启动一个登录shell,设置了shell环境
username 省略时,代表切换到root账户。
- # 不加用户名的 nologin shell
- [yy@centos7 ~ 17:25:26]$ su
- 密码:
- # 很多环境变量仍保留为laoma用户
- [root@centos7 yy 17:25:31]# env | grep yy
- HOSTNAME=centos7.yy
- USER=yy
- PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/yy/.local/bin:/home/yy/bin
- MAIL=/var/spool/mail/yy
- PWD=/home/yy
- LOGNAME=yy
- XDG_DATA_DIRS=/home/yy/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
- # 不加用户名的 login shell
- [yy@centos7 ~ 17:26:07]$ su -l
- 密码:
- 上一次登录:六 7月 18 17:25:31 CST 2026pts/1 上
- # 所有环境变量都更改为了root用户
- [root@centos7 ~ 17:26:11]# set | grep yy
- HOSTNAME=centos7.yy
复制代码
提示: 尽可能使用 loging shell 登录。
准备一个用户
- # 添加一个用户
- [root@centos7 ~ 17:27:37]# useradd yue
- # 设置密码为redhat
- [root@centos7 ~ 17:28:12]# echo redhat | passwd --stdin yue
- 更改用户 yue 的密码 。
- passwd:所有的身份验证令牌已经成功更新。
- [root@centos7 ~ 17:28:32]# grep yue /etc/passwd
- yue:x:1002:1003::/home/yue:/bin/bash
- # 以特定用户身份执行特定命令
- [yy@centos7 ~ 19:00:37]$ su -l yue -c id
- 密码:
- uid=1001(yue) gid=1001(yue) 组=1001(yue) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
- # 加单引号
- [yy@centos7 ~ 19:01:31]$ su -l yue -c 'cat /etc/hosts'
- 密码:
- 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
- ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
- # 不加单引号
- [yy@centos7 ~ 19:01:36]$ su -l yue -c cat /etc/hosts
- 密码:
- hello
- hello
- # 原因:没有把 "cat /etc/hosts" 当作整体
复制代码
其他使用方法
- # 创建的文件位置在 ~yy/haha
- [root@centos7 ~ 19:02:50]# su -l -c 'touch haha' yy
- # 无权创建
- [root@centos7 ~ 19:03:09]# su -c 'touch haha' yy
- touch: 无法创建"haha": 权限不够
- # 原因:nologin shell 执行,当前位置不变,导致yy用户无法在/root下创建
- # 切换 nologin shell 账户
- [root@centos7 ~ 19:03:41]# grep adm /etc/passwd
- adm:x:3:4:adm:/var/adm:/sbin/nologin
- [root@centos7 ~ 19:04:17]# su -l adm -c id
- This account is currently not available.
- [root@centos7 ~ 19:04:31]# 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 ~ 19:04:57]# su -l adm -s /bin/bash
- 上一次登录:日 7月 19 19:04:57 CST 2026pts/0 上
- -bash-4.2$
- # 提示符不正常,原因是家目录中缺少bash相关配置文件
- # 处理方法如下:
- [root@centos7 ~ 19:05:53]# grep adm /etc/passwd
- adm:x:3:4:adm:/var/adm:/sbin/nologin
- [root@centos7 ~ 19:06:06]# cp /etc/skel/{.bash_profile,.bashrc} /var/adm
- [root@centos7 ~ 19:06:40]# su adm -l -s /bin/bash
- 上一次登录:日 7月 19 19:05:38 CST 2026pts/0 上
- [adm@centos7 ~ 19:06:53]$
复制代码
sudo 命令
从根本上说,Linux实现了一个非常粗糙的获得权限模型:root 可以做任何事情,其他用户与系统相关什么也不能做。
- su 缺点:
- 用户必须知道 root 用户密码获取 root 用户所有权限。
- 未记录用户执行命令。
- 无法以 /sbin/nologin 的用户身份运行命令。
- sudo 优点:
- sudo 允许用户以其他用户身份执行特定命令。
- sudo 需要用户输入用户自己的密码,而非他们想访问的用户密码。
- sudo 执行的命令会记录在 /var/log/secure 文件中。
sudo 语法:sudo [-u username] command
- # 有sudo权限的用户,输入自己的密码,确认是否是本人在操作
- [yy@centos7 ~ 19:06:10]$ sudo id
- [sudo] password for yy:
- uid=0(root) gid=0(root) groups=0(root) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
- # 没有sudo权限的用户
- [yy@centos7 ~ 19:07:28]$ sudo id
- 我们信任您已经从系统管理员那里了解了日常注意事项。
- 总结起来无外乎这三点:
- #1) 尊重别人的隐私。
- #2) 输入前要先考虑(后果和风险)。
- #3) 权力越大,责任越大。
- [sudo] yy 的密码:
- yy 不在 sudoers 文件中。此事将被报告。
复制代码
sudo 配置
- [root@centos7 ~ 19:15:06]# export EDITOR=vim
- [root@centos7 ~ 19:15:19]# visudo
- # 其中两条记录,wheel组中成员,可以以任何用户身份执行任何命令
- root ALL=(ALL) ALL
- # 组以%开头
- %wheel ALL=(ALL) ALL
复制代码
示例1:
- # yy 记录如下()
- yy ALL=(ALL) ALL
复制代码
验证:
- [yy@centos7 ~ 19:17:21]$ sudo id
- [sudo] yy 的密码:
- uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
复制代码
**示例2:**不需要输入密码情况下,直接执行命令。
- # yy 记录如下
- yy ALL=(ALL) NOPASSWD:ALL
复制代码
验证:
- [yy@centos7 ~ 19:19:38]$ sudo id
- uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
复制代码
**示例3:**只能够执行特定命令。
- # yy 记录如下
- yy ALL=(ALL) /sbin/useradd,/sbin/usermod,/sbin/userdel
复制代码
验证:
- [yy@centos7 ~ 19:20:54]$ sudo id
- 对不起,用户 yy 无权以 root 的身份在 centos7.yy 上执行 /bin/id。
- [yy@centos7 ~ 19:21:53]$ sudo useradd lao
- [yy@centos7 ~ 19:22:02]$ id lao
- uid=1003(lao) gid=1004(lao) 组=1004(lao)
复制代码
**总结:**在分配命令的时候,切记只给用户特定功能的命令(例如用户管理相关命令),而不是通用功能的工具(例如 vim)。
配置文件路径:
- 主配置文件:/etc/sudoers,正常情况不要修改。
- 从配置文件:/etc/sudoer.d/*,如果想添加配置,在此处添加。
示例:
- [root@centos7 ~ 19:22:43]# echo 'yue ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers.d/yy
- [root@centos7 ~ 19:23:14]# cat /etc/sudoers.d/yy
- yue ALL=(ALL) NOPASSWD:ALL
复制代码
命令别名
- Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum
- # sys组中成员执行以下命令别名中的所有命令
- %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
复制代码
案例
- 配置用户 xiaoniuma 可以以root身份运行vim命令
- 用户 xiaoniuma 将自己提权为 root 用户 - 方法一:使用vim将/etc/passwd中用户的uid改为0 - 方法二:将sudo规则中vim程序改为bash或者ALL
操作过程:
- # 创建用户
- [root@centos7 ~ 19:23:22]# useradd xiaoniuma
- [root@centos7 ~ 19:23:56]# echo 123 | passwd --stdin xiaoniuma
- # 配置sudo
- [root@centos7 ~ 19:24:15]# echo 'xiaoniuma ALL=(ALL) /bin/vim' > /etc/sudoers.d/xiaoniuma
- # 切换用户并修改用户id
- [root@centos7 ~ 19:24:57]# sudo vim /etc/passwd
- # 修改 xiaoniuma 的 UID 为0
- xiaoniuma:x:0:1001::/home/xiaoniuma:/bin/bash
- # 验证
- [xiaoniuma@centos7 ~ 19:27:18]$ su -l xiaoniuma
- 密码:
- [root@centos7 ~ 19:27:40]#
复制代码
还原环境
- # 修改用户id为原来的1001
- [xiaoniuma@centos7 ~ 19:28:08]$ sudo vim /etc/passwd
- xiaoniuma:x:1001:1001::/home/xiaoniuma:/bin/bash
- # 删除用户
- [root@centos7 ~ 19:30:12]# userdel -r xiaoniuma
- # 删除sudo规则
- [root@centos7 ~ 19:30:24]# rm -f /etc/sudoers.d/xiaoniuma
复制代码
提权总结
以下是关于 Linux 中 su 和 sudo 使用的几条建议:
- 优先选用 sudo,减少 su 的使用频次
sudo仅针对单条命令临时授予管理员权限,命令执行完毕会自动切回普通用户身份,严格遵循最小权限原则,大幅降低误删系统文件、误改配置的风险;而su会完整切换至 root 交互式终端,全程持有系统最高权限,长时间操作极易引发安全事故。
- 限定 su 的适用场景,用完及时退出
仅当需要连续执行多条系统运维指令时,才临时使用su -切换 root 环境;所有操作完成后务必执行exit退回普通账号,不要以 root 身份浏览文件、执行日常无关操作。另外su切换 root 需要共享 root 密码,多人服务器存在密码泄露隐患。
- 精细化管控 sudoers 权限,拒绝全量授权
修改 sudo 权限配置必须使用visudo命令,该工具自带语法校验,能避免配置错误导致管理员权限锁死。配置时遵循最小权限原则,不要直接授予用户全部 root 权限,可以限定用户仅能执行指定运维命令,CentOS 环境示例:laoma ALL=(ALL) /usr/bin/yum, /usr/bin/systemctl restart network。
- 执行特权命令尽量使用绝对路径
调用 sudo 执行命令时,建议填写程序完整绝对路径,例如sudo /usr/bin/yum list installed,可以规避恶意篡改 PATH 环境变量带来的命令劫持漏洞,提升操作安全性。
- 脚本不要明文携带 sudo 密码
切勿通过管道、文本硬编码等方式传递 sudo 密码,存在明文泄露风险;如果自动化脚本需要免密执行特权操作,可以在sudoers中配置NOPASSWD,仅放开脚本所需命令的免密权限。
- 定期核查权限操作审计日志
不同发行版日志路径存在区别:Ubuntu/Debian 记录在/var/log/auth.log,CentOS/RHEL 系列统一存放在/var/log/secure。定期检索日志能够完整追溯所有 su、sudo 提权行为,及时发现异常越权操作。
- 交互式 root 环境推荐 sudo -i 替代 su -
如果需要完整的 root 登录环境做批量操作,推荐使用sudo -i。它会完整加载 root 用户环境变量,同时所有操作都会生成 sudo 审计日志,且只需验证当前普通用户密码,无需共享 root 账号密码。