运维入门必学:从用户分组到 sudo 提权,打通权限全链路 Linux 用户和组管理综合案例手动创建一个用户# 1 添加账户[dengcentos7 ~19:04:32]$vim/etc/passwd# 最后一行添加如下内容注意uid要在原有的基础上增加1zhangsan:x:1002:1002::/home/zhangsan:/bin/bash# 2 添加组[dengcentos7 ~19:05:44]$vim/etc/group# 最后一行添加如下内容zhangsan:x:1002:# 3 添加密码[dengcentos7 ~19:06:58]$vim/etc/shadow# 最后一行添加如下内容zhangsan:$6$FgUNKn74yoEDbcXD$pxDk9AEhsxkJGYi76Rv91zLy5LRns8olgAyGuNssQYG07ypaidhuX0gHAU4hrNi9Zp9A7vtMEvbyzCQ0e/gbk1::0:99999:7:::# 4 准备家目录[dengcentos7 ~19:08:12]$cp-r/etc/skel/ /home/zhangsan# 修改zhangsan家目录所属有zhangsan用户和组[dengcentos7 ~19:09:33]$chownzhangsan:zhangsan /home/zhangsan[dengcentos7 ~19:10:15]$ ll-d/home/zhangsan drwxr-xr-x.16zhangsan zhangsan40967月1919:10 zhangsan# 测试[dengcentos7 ~19:11:42]$sshzhangsanlocalhostbash 提示符变为初始字符提示符如下bash-4.2$模拟[dengcentos7 ~19:12:55]$mv/etc/bashrc{,.ori}[dengcentos7 ~19:13:27]$bashbash-4.2#原因nologin shell打开的时候执行/etc/bashrc配置。恢复bash-4.2# mv /etc/bashrc{.ori,}bash-4.2# bash[dengcentos7 ~19:14:41]$误删用户家目录故障[dengcentos7 ~19:15:56]$sshzhangsanlocalhost zhangsanlocalhosts password: Activate the web console with: systemctlenable--nowcockpit.socket Last login: SAT Jul1919:15:582026from ::1 Could not chdir to home directory /home/zhangsan: No suchfileor directory -bash-4.2$模拟[dengcentos7 ~19:16:33]$rm-fr/home/zhangsan解决[dengcentos7 ~19:17:52]$cp-r/etc/skel/ /home/zhangsan[dengcentos7 ~19:18:32]$chownzhangsan:zhangsan /home/zhangsan没有权限切换家目录故障Could not chdir to home directory /home/zhangsan: Permission denied -bash: /home/zhangsan/.bash_profile: 权限不够模拟[dengcentos7 ~19:19:48]$chmodu- /home/zhangsan解决[dengcentos7 ~19:20:55]$chown-Rzhangsan:zhangsan /home/zhangsan[dengcentos7 ~19:21:38]$chmodurwx /home/zhangsan[dengcentos7 ~19:22:14]$ ll-d/home/zhangsan drwx------.3zhangsan zhangsan787月1919:15 /home/zhangsan本地组管理groupadd 命令# 创建名称为 admin 的组[dengcentos7 ~19:23:42]$groupaddadmin# 创建名称为sysadmin的组组id为2000[dengcentos7 ~19:24:18]$groupaddsysadmin-g2000# 验证[dengcentos7 ~19:25:02]$grepadmin /etc/group printadmin:x:997: admin:x:1002: sysadmin:x:2000:groupmod 命令# 修改组名称[dengcentos7 ~19:26:33]$groupmod--new-name admins admin# 修改组id[dengcentos7 ~19:27:15]$groupmod-g2002admins# 验证[dengcentos7 ~19:28:44]$grepadmins/etc/group admins:x:2002:groupdel 命令[dengcentos7 ~19:29:55]$groupdelsysadmin[dengcentos7 ~19:30:27]$grepsysadmin /etc/groupgroupmem 命令[dengcentos7 ~19:31:42]$ groupmems--help用法groupmems[选项][动作]选项 -g,--groupgroupname 更改组 groupname而不是用户的组(只 root)-R,--rootCHROOT_DIRchroot到的目录 动作 -a,--addusername 将用户 username 添加到组成员中 -d,--deleteusername 从组的成员中删除用户 username -h,--help显示此帮助信息并推出 -p,--purge从组中移除所有成员 -l,--list列出组中的所有成员# 添加成员[dengcentos7 ~19:32:58]$ groupmems-gadmins-adeng[dengcentos7 ~19:33:33]$ groupmems-gadmins-ldeng[dengcentos7 ~19:34:17]$iddenguid1000(deng)gid1000(deng)组1000(deng),10(wheel),2002(admins)# 删除成员[dengcentos7 ~19:35:42]$ groupmems-gadmins-ddeng[dengcentos7 ~19:36:15]$ groupmems-gadmins-l# 清空组中所有成员[dengcentos7 ~19:37:22]$ groupmems-gadmins-adeng[dengcentos7 ~19:38:05]$ groupmems-gadmins-p课后练习创建developer组组id为2000[dengcentos7 ~15:37:05]groupadd-g2000developer修改developer组名称为developers组id为3000[dengcentos7 ~15:37:16]groupmod-ndevelopers-g3000developer创建developer1用户并添加到组developers[dengcentos7 ~15:37:49]useradd-Gdevelopers developer1将developer1用户从组developers中删除[dengcentos7 ~15:38:15]gpasswd-ddeveloper1 developers删除组developers[dengcentos7 ~15:38:29]groupdel developers管理用户密码shadow 文件/etc/shadow文件保存操作系统登录用户密码信息。每行包含一个登录用户信息以冒号分隔九个域。示例[dengcentos7 ~19:39:18]$grepdeng /etc/shadow deng:$6$m0OgWyIu$P2TF1pB8MO...J3LopEUdhmp/Ir/:19300: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 命令# 查看用户密码信息[dengcentos7 ~19:40:33]$ chage-ldeng 最近一次密码修改时间 7月18,2026密码过期时间 从不 密码失效时间 从不 帐户过期时间 从不 两次改变密码之间相距的最小天数 0 两次改变密码之间相距的最大天数 99999 在密码过期之前警告的天数 7# 修改用户密码要求[dengcentos7 ~19:41:15]$ chage-M100deng[dengcentos7 ~19:42:02]$ chage-ldeng 最近一次密码修改时间 7月18,2026密码过期时间 从不 密码失效时间 从不 帐户过期时间 从不 两次改变密码之间相距的最小天数 0 两次改变密码之间相距的最大天数 100[dengcentos7 ~19:43:27]$ chage-m10deng[dengcentos7 ~19:44:18]$ chage-ldeng 最近一次密码修改时间 7月18,2026密码过期时间 从不 密码失效时间 从不 帐户过期时间 从不 两次改变密码之间相距的最小天数 10 两次改变密码之间相距的最大天数 100 在密码过期之前警告的天数 7[dengcentos7 ~19:45:33]$ chage-d0deng# 验证[dengcentos7 ~19:46:08]$sshdenglocalhost denglocalhosts password: You are required to change your password immediately(root enforced)Last login: SAT Jul1919:46:092026from localhost WARNING: Your password has expired. You must change your password now and login again!更改用户 deng 的密码 。 为 deng 更改 STRESS 密码。 当前UNIX 密码# 设置用户密码过期时间是过去的一个时间以便确保用户密码过期登录时强制用户更改密码# 设置为1确保密码很久未改动[dengcentos7 ~19:47:22]$ chage-d1deng# 设置用户账户过期时间是过去的一个时间以便锁定用户账户[dengcentos7 ~19:48:35]$ chage-E1970-1-1 dengusermod -p 更改用户密码# 更改deng的密码与laowang一致[dengcentos7 ~19:49:55]$greplaowang /etc/shadow laowang:$6$dQcDSqtz$Nboi6QLMzscWSLvnnRO86gm3XI/qbgfnK5zVv2Ix13EktQ97vwNsqQlrfI2K/b1mVnHNgzmMNIb0P4HnTugog/:19304:0:99999:7:::[dengcentos7 ~19:50:33]$usermod-p$6$dQcDSqtz$Nboi6QLMzscWSLvnnRO86gm3XI/qbgfnK5zVv2Ix13EktQ97vwNsqQlrfI2K/b1mVnHNgzmMNIb0P4HnTugog/deng# 删除用户密码[dengcentos7 ~19:51:17]$usermod-pdengusermod -s 限定用户shell# 默认情况下root用户可以切换到任何用户而且不需要密码[dengcentos7 ~19:52:42]$su- laowang 上一次登录二7月1817:24:02 CST 2022tty1 上[laowangcentos7 ~]$ 登出# 更改用户shell为 /sbin/nologin[dengcentos7 ~19:53:25]$usermod-s/sbin/nologin laowang[dengcentos7 ~19:54:08]$su- laowang 上一次登录二7月1919:52:42 CST 2022pts/0 上 This account is currently not available.# 将用户shell改为/bin/bash[dengcentos7 ~19:55:33]$usermod-s/bin/bash laowangusermod -L 锁定用户密码等效于passwd -l[dengcentos7 ~19:56:15]$usermod-Llaowang# 输入正确的密码也无法登录[dengcentos7 ~]$su- laowang Password: su: Authentication failure[dengcentos7 ~]$usermod -U 解锁用户密码等效于passwd -u[dengcentos7 ~19:57:42]$usermod-Ulaowang# 输入正确的密码登录[dengcentos7 ~]$su- laowang Password:[laowangcentos7 ~]$passwd -d 删除密码# 删除用户密码即可[dengcentos7 ~19:58:33]$passwd-dlaowang 清除用户的密码 laowang。 passwd: 操作成功用户登录的时候输入用户名即可登录。设置账户过期等效于passwd -e# 设置账户过期时间为过去的某一个日期[dengcentos7 ~19:59:42]$usermod-e2024-7-18 laowang# 或者[dengcentos7 ~20:00:18]$ chage-E2024-7-18 laowang增加一个 uid 为 0 的用户方法一[dengcentos7 ~20:01:33]$vim/etc/passwd# 将自己的用户id该为0此时deng用户可以行使root权限了deng:x:0:1000:deng:/home/deng:/bin/bash方法二[dengcentos7 ~20:02:55]$useradd-o-u0deng[dengcentos7 ~20:03:33]$iddenguid0(root)gid0(root)组0(root)deng 和 root 账户是两个不同的账户但是deng用户获得了root账户权限。课后作业添加用户 laowang设置密码与deng用户一致。不允许使用passwd命令设置 laowang 密码首次登录必须修改密码3天内不允许修改100天后过期禁止 laowang 登录系统至少使用2种方法。其他 shell# 查看系统中 shell 清单[dengcentos7 ~20:04:48]$cat/etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash[dengcentos7 ~20:05:22]$ ll /bin/sh /usr/bin/sh lrwxrwxrwx.1root root47月1410:27 /bin/sh -bashlrwxrwxrwx.1root root47月1410:27 /usr/bin/sh -bash# 新增 tmux shell[dengcentos7 ~20:06:33]$ yuminstall-ytmux# 新增 c shell[dengcentos7 ~20:07:18]$ yuminstall-ytcsh[dengcentos7 ~20:08:42]$ ll /bin/csh /usr/bin/csh lrwxrwxrwx.1root root47月1410:30 /bin/csh -tcsh lrwxrwxrwx.1root root47月1410:30 /usr/bin/csh -tcshtmux 控制键 ctrlb:c新建一个会话N切换到N号会话例如数字1切换到1号会话。Linux 提权管理大多数时候Linux系统管理员以非特权用户身份登录系统并使用工具暂时获得特权用户root管理系统。su 命令示例1su username启动一个非登录shell使用当前的环境设置上一个用户示例2su -l username启动一个登录shell设置了shell环境username 省略时代表切换到root账户。# 不加用户名的 nologin shell[dengcentos7 ~20:09:55]$suPassword:redhat# 很多环境变量仍保留为deng用户[dengcentos7 deng20:10:33]$env|grepdengLOGNAMEdengMAIL/var/spool/mail/dengPATH/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/deng/.local/bin:/homelaoma/binPWD/home/dengUSERdengXDG_DATA_DIRS/home/deng/.local/share/flatpak/exports/share:/var/lib/flatpak/exports/share:/usr/local/share:/usr/share# 不加用户名的 login shell[dengcentos7 ~20:11:42]$su-l密码 上一次登录六7月1815:17:32 CST 2026pts/1 上# 所有环境变量都更改为了root用户[dengcentos7 ~20:12:15]$set|grepdeng[dengcentos7 ~20:12:33]$**提示**尽可能使用 loging shell 登录。准备一个用户# 添加一个用户[dengcentos7 ~20:13:48]$useraddlaowang# 设置密码为redhat[dengcentos7 ~20:14:22]$echoredhat|passwd--stdinlaowang Changing passwordforuser laowang. passwd: all authentication tokens updated successfully.[dengcentos7 ~20:15:05]$greplaowang /etc/passwd laowang:x:1001:1001::/home/laowang:/bin/bash# 以特定用户身份执行特定命令[dengcentos7 ~20:16:18]$su-llaowang-cidPassword:uid1001(laowang)gid1001(laowang)groups1001(laowang)contextunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023# 加单引号[dengcentos7 ~20:17:33]$su-llaowang-ccat /etc/hostsPassword:127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6# 不加单引号[dengcentos7 ~20:18:55]$su-llaowang-ccat/etc/hosts Password: hello hello# 原因没有把 cat /etc/hosts 当作整体其他使用方法# 创建的文件位置在 ~deng/haha[dengcentos7 ~20:19:33]$su-l-ctouch hahadeng# 无权创建[dengcentos7 ~20:20:18]$su-ctouch hahadeng touch: 无法创建haha:权限不够# 原因nologin shell 执行当前位置不变导致deng用户无法在/root下创建# 切换 nologin shell 账户[dengcentos7 ~20:21:42]$grepadm /etc/passwd adm:x:3:4:adm:/var/adm:/sbin/nologin[dengcentos7 ~20:22:18]$su-ladm-cidThis account is currently not available.[dengcentos7 ~20:23:05]$su-ladm-s/bin/bash-ciduid3(adm)gid4(adm)组4(adm)# 只有 root 用户可以指定 shell[dengcentos7 ~20:24:33]$su-ladm-s/bin/bash -bash-4.2$# 提示符不正常原因是家目录中缺少bash相关配置文件# 处理方法如下[dengcentos7 ~20:25:18]$grepadm /etc/passwd adm:x:3:4:adm:/var/adm:/sbin/nologin[dengcentos7 ~20:25:42]$cp/etc/skel/{.bash_profile,.bashrc}/var/adm[dengcentos7 ~20:26:05]$suadm-l-s/bin/bash 上一次登录三7月1816:16:32 CST 2025pts/0 上[admcentos7 ~20:26:33]$sudo 命令从根本上说Linux实现了一个非常粗糙的获得权限模型root 可以做任何事情其他用户与系统相关什么也不能做。su 缺点用户必须知道 root 用户密码获取 root 用户所有权限。未记录用户执行命令。无法以/sbin/nologin的用户身份运行命令。sudo 优点sudo 允许用户以其他用户身份执行特定命令。sudo 需要用户输入用户自己的密码而非他们想访问的用户密码。sudo 执行的命令会记录在/var/log/secure文件中。sudo 语法sudo [-u username] command# 有sudo权限的用户输入自己的密码确认是否是本人在操作[dengcentos7 ~20:27:48]$sudoid[sudo]passwordfordeng:uid0(root)gid0(root)groups0(root)contextunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023# 没有sudo权限的用户[laowangcentos7 ~]$sudoidWe trust you have received the usual lecture from thelocalSystem Administrator. It usually boils down to these three things:#1) Respect the privacy of others.#2) Think before you type.#3) With great power comes great responsibility.[sudo]passwordforlaowang: laowang is notinthe sudoers file. This incident will be reported.sudo 配置[dengcentos7 ~20:28:55]$exportEDITORvim[dengcentos7 ~20:29:22]$ visudo# 其中两条记录wheel组中成员可以以任何用户身份执行任何命令rootALL(ALL)ALL# 组以%开头%wheelALL(ALL)ALL示例1# laowang 记录如下laowangALL(ALL)ALL验证[laowangcentos7 ~]$sudoid[sudo]passwordforlaowang:uid0(root)gid0(root)groups0(root)contextunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023**示例2**不需要输入密码情况下直接执行命令。# laowang 记录如下laowangALL(ALL)NOPASSWD:ALL验证[laowangcentos7 ~]$sudoiduid0(root)gid0(root)groups0(root)contextunconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023**示例3**只能够执行特定命令。# laowang 记录如下laowangALL(ALL)/sbin/useradd,/sbin/usermod,/sbin/userdel验证[laowangcentos7 ~]$sudoid[sudo]passwordforlaowang: Sorry, user laowang is not allowed to execute/bin/idas root on centos7.wanho.net.[laowangcentos7 ~]$sudouseraddlaozhang[sudo]passwordforlaowang:[laowangcentos7 ~]$idlaozhanguid1002(laozhang)gid1002(laozhang)groups1002(laozhang)**总结**在分配命令的时候切记只给用户特定功能的命令例如用户管理相关命令而不是通用功能的工具例如 vim。配置文件路径主配置文件/etc/sudoers正常情况不要修改。从配置文件/etc/sudoer.d/*如果想添加配置在此处添加。示例[dengcentos7 ~20:30:48]$echolaowang ALL(ALL) NOPASSWD:ALL/etc/sudoers.d/laowang[dengcentos7 ~20:31:15]$cat/etc/sudoers.d/laowang laowangALL(ALL)NOPASSWD:ALL命令别名Cmnd_Alias SOFTWARE/bin/rpm, /usr/bin/up2date, /usr/bin/yum# sys组中成员执行以下命令别名中的所有命令%sys ALLNETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS案例配置用户 xiaoniuma 可以以root身份运行vim命令用户 xiaoniuma 将自己提权为 root 用户方法一使用vim将/etc/passwd中用户的uid改为0方法二将sudo规则中vim程序改为bash或者ALL操作过程# 创建用户[dengcentos7 ~20:32:33]$useraddxiaoniuma[dengcentos7 ~20:33:05]$echo123|passwd--stdinxiaoniuma# 配置sudo[dengcentos7 ~20:33:42]$echoxiaoniuma ALL(ALL) /bin/vim/etc/sudoers.d/xiaoniuma# 切换用户并修改用户id[xiaoniumacentos7 ~]$sudovim/etc/passwd# 修改 xiaoniuma 的 UID 为0xiaoniuma:x:0:1001::/home/xiaoniuma:/bin/bash# 验证[xiaoniumacentos7 ~]$su-lxiaoniuma 密码[dengcentos7 ~20:34:18]$还原环境# 修改用户id为原来的1001[xiaoniumacentos7 ~]$sudovim/etc/passwd xiaoniuma:x:1001:1001::/home/xiaoniuma:/bin/bash# 删除用户[dengcentos7 ~20:35:33]$userdel-rxiaoniuma# 删除sudo规则[dengcentos7 ~20:36:05]$rm-f/etc/sudoers.d/xiaoniuma提权总结以下是关于 Linux 中su和sudo使用的几条建议优先使用sudo而非susudo允许临时获取管理员权限操作完成后自动退回普通用户状态降低误操作风险而su会直接切换到 root 身份长期保持高权限状态存在安全隐患。限制su的使用范围尽量仅在需要长时间执行多个管理员操作时使用su且完成后立即通过exit退出 root 身份避免在 root 权限下进行日常操作。合理配置sudoers文件通过visudo命令配置sudoers精确控制用户可执行的管理员命令如user ALL(ALL) /bin/apt避免授予无限制的sudo权限。注意命令的完整路径使用sudo时尽量指定命令的绝对路径如sudo /usr/bin/apt update防止因环境变量篡改导致的安全风险。避免在脚本中硬编码sudo密码不要在脚本中直接写入sudo密码如通过管道传递可通过配置sudoers实现特定命令免密执行或使用更安全的权限管理方式。定期审计操作日志sudo的操作会记录在/var/log/auth.log或/var/log/secure中定期检查日志可追踪权限使用情况及时发现异常操作。使用sudo -i替代su进行交互式操作若需要类似su的交互式 root 环境可使用sudo -i它会加载 root 的环境变量同时保留sudo的日志记录功能。课后练习解析以下每个命令作用并且至少使用三个示例说明。su 命令使用说明su switch user切换系统登录用户默认不加参数直接切换到root 超级管理员切换时需要输入目标用户的密码。底层原理临时替换当前进程的用户 ID、组 ID继承原用户环境不加-或全新目标用户环境加-。示例 1su - 完整切换 root 用户su-示例 2su - -c 临时用 root 执行单条命令不切换终端su- root-ccat /etc/shadow示例 3su - 切换到普通用户 developer1su- developer1sudo 命令使用说明sudo superuser do临时借 root 权限执行单条命令输入当前自己用户的密码权限由 /etc/sudoers 文件管控无需知道 root 密码。示例 1切换到 root 管理员完整环境最常用sudocat/etc/shadow示例 2查看自己拥有的 sudo 权限sudo-l示例 3以普通用户 developer1 身份执行命令sudo-udeveloper1touch/home/developer1/test.txt