尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Linux 用户与组管理完全指南:passwd/group 两大文件 + useradd/usermod/groupadd 全命令实战

Linux 用户与组管理完全指南:passwd/group 两大文件 + useradd/usermod/groupadd 全命令实战 为什么要给每个运维单独建账号/etc/passwd里 7 个冒号分隔的字段是什么意思把人加进 wheel 组为什么就有了 sudo 权限本文按「用户与组的概念 → 底层配置文件 → 增删改查命令 → 组管理」展开每个命令都配「用法速查表」和可复制的实战示例照着敲一遍就能把账户体系理顺。密码管理与故障排查见姊妹篇。一、用户与组的基本概念用户账户是系统安全的基础每个进程都以特定用户身份运行每个文件都有特定所有者文件所有权正是访问控制的依据。系统内部用UID用户 ID区分用户用户名只是便于记忆的标识。用户的三种类型类型说明特征superuser超级用户用于管理系统用户名rootUID 0对系统有完全访问权限system users系统用户供服务进程使用非特权账户不能交互式登录shell 为/sbin/nologinregular users普通用户日常工作使用通常 UID ≥ 1000区分的关键不是用户名而是UIDUID 为 0 的账户就拥有 root 权限怎么「造」UID0 的账户、有多危险见姊妹篇。/etc/passwd 文件/etc/passwd保存操作系统的登录用户信息每行一个用户用冒号分隔 7 个字段name:password:UID:GID:GECOS:directory:shell[zhbzhb-m1 ~]$grepzhb /etc/passwd zhb:x:1000:1000:software admin:/home/zhb:/bin/bash字段含义说明name用户登录名登录时输入的用户名password密码占位符恒为x真正的密码在/etc/shadowUID用户 ID系统内部唯一标识GID主组 ID用户的主要组编号GECOS描述信息通常是用户真实姓名可留空directory家目录登录后的初始工作目录默认/home/用户名shell登录 shell打开终端时运行的程序系统用户为/sbin/nologin# 系统用户的 shell 是 /sbin/nologin无法登录[zhbzhb-m1 ~]$greppostfix /etc/passwd postfix:x:89:89::/var/spool/postfix:/sbin/nologin/etc/group 文件组是用户的集合组内用户继承该组权限。系统内部用GID组 ID区分组。/etc/group每行一个组用冒号分隔 4 个字段group_name:password:GID:user_list[zhbzhb-m1 ~]$grepwheel /etc/group wheel:x:10:zhb字段含义说明group_name组名称—password组密码占位符恒为xGID组 ID唯一标识一个组user_list补充组成员以逗号分隔不含以该组为主组的成员组的类型主要组每个用户有且只有一个由/etc/passwd的 GID 字段定义。用户新建文件的属组默认是主要组。创建普通用户时通常会自动建一个同名同 ID 的组作为其主要组用户专用组便于简化文件权限管理。补充组用户可以同时加入多个资格记录在/etc/group的user_list字段。用户对文件的访问权限等于主要组 所有补充组权限的并集。# 查看当前用户信息uid、gid、所属的全部组[zhbzhb-m1 ~]$iduid1000(zhb)gid1000(zhb)组1000(zhb),10(wheel)# 查看指定用户的 uid[zhbzhb-m1 ~]$id-uzhb1000举例某用户主组user01、补充组wheel和webadmin这三个组可读的文件他都能读 —— 权限取并集这就是「加组 授权」的底层逻辑wheel详见下文。编辑与检查配置文件的正确工具直接vim /etc/passwd是有风险的没有语法检查、也没有并发保护。系统提供了专门的安全编辑命令。用法速查表命令作用说明vipw安全编辑/etc/passwd带文件锁防止多人同时写坏保存时做语法校验vipw -s安全编辑/etc/shadow同上vigr安全编辑/etc/group同上vigr -s安全编辑/etc/gshadow同上pwck检查 passwd 与 shadow 的一致性字段缺失、UID 重复、家目录不存在都能查出来grpck检查 group 与 gshadow 的一致性同理# 安全编辑等价于 vim /etc/passwd但带锁 语法检查[rootzhb-m1 ~]# vipw# 检查用户配置文件的一致性[rootzhb-m1 ~]# pwck[rootzhb-m1 ~]# grpck为什么不能直接 vim并发冲突两人同时vim /etc/passwd后保存的会整个覆盖先保存的。格式写错少冒号、UID 重复这类错误 vim 不拦一旦保存所有人都可能登不上系统。vipw保存时会校验语法并拒绝明显错误紧急情况还可用pwck定位问题。后文「手动创建用户」用 vim 是为看清底层原理生产环境请一律用vipw/vigr。特殊组 wheelsudo 权限的钥匙wheel源自英文俚语 “big wheel”大人物是 Linux 中约定俗成的管理员组GID 通常为10—— 在/etc/group里它只是一条普通的组记录。关键点wheel组本身不带任何特权。成员能用sudo是因为/etc/sudoers里写了这样一条授权规则# 查看 sudoers 中对 wheel 组的授权注意前面的 % 表示「组」[rootzhb-m1 ~]# grep wheel /etc/sudoers%wheelALL(ALL)ALL这条规则的含义拆解部分含义%wheel适用对象wheel组的所有成员%前缀表示组不加%则表示用户第一个ALL允许从哪些主机使用ALL 任意主机(ALL)允许以哪个用户的身份执行ALL 任意用户含 root第二个ALL允许执行哪些命令ALL 任意命令合起来就是wheel 组的成员可以从任意主机、以任意用户身份、执行任意命令—— 这就是完整的 root 等价权限。把用户加入 wheel本质是命中 sudoers 里这条授权规则# 把用户加入 wheel-aG 追加到补充组一定不能漏 -a[rootzhb-m1 ~]# usermod -aG wheel zhangsan# 用 su - 或直接重登让新组生效已有会话不刷新组信息[zhangsanzhb-m1 ~]$iduid1002(zhangsan)gid1002(zhangsan)组1002(zhangsan),10(wheel)# 查看自己当前能用 sudo 执行什么[zhangsanzhb-m1 ~]$sudo-l... 用户 zhangsan 可以在 zhb-m1 上运行以下命令(ALL)ALL用法速查表命令作用说明grep wheel /etc/group查看 wheel 组成员冒号后最后一段是成员列表usermod -aG wheel 用户授予 sudo 权限务必带-a漏了会清空该用户其他补充组gpasswd -a 用户 wheel同上另一种写法与usermod -aG效果相同gpasswd -d 用户 wheel收回 sudo 权限删除组成员资格即可无需动 sudoersvisudo安全编辑/etc/sudoers带锁 语法校验禁止直接 vimsudo -l查看自己被授权的命令不知道自己能干什么时第一条命令sudo -l -U 用户查看指定用户的 sudo 权限root 可用用于审计sudo -k清空 sudo 免密缓存下次 sudo 需重新输密码三个必须知道的坑%不能漏sudoers 里%wheel表示组wheel无百分号表示名叫 wheel 的用户。写漏了规则完全不生效。不是所有发行版都用 wheelRHEL / CentOS / Rocky 用wheelUbuntu / Debian 用的是sudo组/etc/sudoers里对应%sudo ALL(ALL:ALL) ALL。照搬命令到 Ubuntu 上会「加了组却没权限」。用grep -E ^(%wheel|%sudo) /etc/sudoers确认本机用的是哪个组。永远用visudo改 sudoers直接vim /etc/sudoers一旦写错语法所有人的 sudo 全部失效且此时你又需要 sudo 才能改回来 —— 只能进救援模式。二、查看登录用户用法速查表命令作用说明whoami显示当前终端登录的用户最常用于「我到底是谁」who am i显示当前终端的登录信息带终端号和登录时间who列出所有终端上登录的用户含终端、登录时间、来源 IPw显示登录用户及其正在做的事比who多了负载、空闲时间、当前命令users只列出登录用户名输出最简洁重名会重复显示last查看历史登录记录读取/var/log/wtmp# 查看当前终端登录的用户[rootzhb-m1 ~]# whoamiroot# 查看当前系统中所有终端上登录的用户[zhbzhb-m1 ~]$whoroot pts/0 Dec2208:43(10.1.8.1)zhb pts/1 Dec2209:23(10.1.8.1)zhb pts/2 Dec2209:07(10.1.8.1)# w 命令还会显示系统负载和每个用户正在执行的命令[zhbzhb-m1 ~]$ w 09:23:19 up1:10,3users, load average:0.00,0.01,0.05USERTTY FROM LOGIN IDLE JCPU PCPU WHAT root pts/010.1.8.1 08:4339:270.06s0.06s-bashzhb pts/110.1.8.1 09:232.00s0.05s0.01s w zhb pts/210.1.8.1 09:077.00s0.05s0.05s-bash# 只列出登录的用户名[rootzhb-m1 ~]# userszhb zhb rootw输出中IDLE是该用户空闲时长WHAT是当前正在运行的命令——排查「谁把服务器跑爆了」时第一眼就看这两个字段。三、切换用户su 与 su -这是最高频也最容易踩的坑切过去发现命令都用不了多半是漏了那个短横线。用法速查表命令作用加载的配置文件su 用户不完全切换non-login shell只加载~/.bashrc、/etc/bashrcsu - 用户完全切换login shell加载/etc/profile、~/.bash_profile、~/.bashrc、/etc/bashrcsu -c 命令 用户以指定用户身份执行一条命令不切换交互环境sudo 命令以 root 身份执行单条命令需事先授权exit/CtrlD退出当前切换回到上一个用户—# 不完全切换工作目录不变、环境变量还是原用户的[zhbzhb-m1 ~]$suroot Password:[rootzhb-m1 zhb]# pwd/home/zhb# 还在原用户的家目录# 完全切换等价于重新以该用户身份登录[zhbzhb-m1 ~]$su- root Password:[rootzhb-m1 ~]# pwd/root# 已进入自己的家目录# 只借用身份执行一条命令脚本里常用[zhbzhb-m1 ~]$su- postgres-cpsql -c select version()为什么推荐su -su不带-时PATH、LANG、家目录等环境变量还留着上一个用户的常导致「命令找不着」「中文乱码」「明明装了服务却启不来」这类诡异问题。养成写成su - 用户的习惯。四、本地用户管理useradd创建用户用法速查表命令作用说明useradd 用户名创建用户自动建同名主组、同名家目录-u UID指定 UID如-u 8888-d 目录指定家目录如-d /opt/user02-c 描述指定 GECOS 描述如-c user for software manager-g 组指定主组组必须已存在-G 组1,组2指定补充组多个用逗号分隔-s shell指定登录 shell/sbin/nologin表示禁止登录-p 密码指定密码需填加密后的密文填表示无密码-r创建系统用户不建家目录UID 走 SYS_UID 区间-M不创建家目录与-d配合用于「有用户无家」场景-o允许 UID 重复配合-u 0可创建 UID0 的账户危险# 最简方式创建用户[rootzhb-m1 ~]# useradd user01[rootzhb-m1 ~]# grep user01 /etc/passwduser01:x:1003:1003::/home/user01:/bin/bash# 完整参数指定 uid、家目录、描述、主组、shell[rootzhb-m1 ~]# useradd -u 8888 -d /opt/user02 -c user for software manager -g wheel -s /sbin/nologin user02[rootzhb-m1 ~]# grep user02 /etc/passwduser02:x:8888:10:userforsoftware manager:/opt/user02:/sbin/nologin[rootzhb-m1 ~]# ls -d /opt/user02//opt/user02/# 创建一个无密码账户图形化界面可直接登录[rootzhb-m1 ~]# useradd -p tom关键知识新用户家目录的文件来自模板目录/etc/skel/.bashrc、.bash_profile等都从这里复制。下列默认参数定义在/etc/login.defs用useradd -D可查看当前值配置项含义常见值UMASK/HOME_MODE家目录默认权限022/0700PASS_MAX_DAYS密码最长有效期99999PASS_MIN_DAYS密码最短修改间隔0PASS_WARN_AGE过期前提前告警天数7UID_MIN/UID_MAX普通用户 UID 范围1000/60000SYS_UID_MIN/SYS_UID_MAX系统用户 UID 范围201/999CREATE_HOME是否自动创建家目录yes最容易误解的一点/etc/login.defs里的密码策略PASS_MAX_DAYS、PASS_MIN_DAYS等只对新建用户生效对已存在的用户完全不起作用老用户必须用chage逐个改。usermod修改用户属性用法速查表命令作用说明usermod -u UID 用户修改 UID—usermod -md 目录 用户修改家目录并移动内容-m是 move不加则只改记录不搬家usermod -s shell 用户修改登录 shell/sbin/nologin可禁止登录usermod -c 描述 用户修改描述信息—usermod -g 组 用户修改主组—usermod -aG 组 用户追加补充组必须带-a否则会覆盖原有补充组usermod -L 用户锁定密码等效passwd -lusermod -U 用户解锁密码等效passwd -uusermod -p 密文 用户修改密码填 shadow 里的加密串表示清空usermod -e 日期 用户设置账户过期时间等效passwd -e/chage -Eusermod -l 新名 用户修改用户名家目录名需另行修改# 修改 uid、家目录连同文件一起搬走、登录 shell[rootzhb-m1 ~]# usermod user02 -u 1008 -md /home/user02 -s /bin/bash[rootzhb-m1 ~]# grep user02 /etc/passwduser02:x:1008:10:userforsoftware manager:/home/user02:/bin/bash[rootzhb-m1 ~]# ls -d /home/user02//home/user02/# 追加补充组不加 -a 会把原有补充组整个覆盖掉[rootzhb-m1 ~]# usermod -aG user01 user02[rootzhb-m1 ~]# id user02uid1008(user02)gid10(wheel)组10(wheel),1003(user01)userdel删除用户用法速查表命令作用说明userdel 用户删除用户保留家目录和邮件 spooluserdel -r 用户连家目录一起删日常清理用得最多userdel -f 用户强制删除用户仍在登录时也能删慎用# 正常删除不加 -r家目录会被保留下来[rootzhb-m1 ~]# userdel user03# 用户还在登录时删除会被拒绝[rootzhb-m1 ~]# userdel user02userdel: user user02 is currently used by process9071[rootzhb-m1 ~]# id user02uid1008(user02)gid10(wheel)组10(wheel),1003(user01)# 强制删除后才消失[rootzhb-m1 ~]# userdel -f user02userdel: user user02 is currently used by process9071[rootzhb-m1 ~]# id user02id: user02: no such user尽量不要用-f强删。被占用说明该用户还有进程在跑正确做法是先用pkill -u user02结束进程、让用户登出再正常删除 —— 强删会留下无主的进程和文件。删除用户后的遗留文件易踩坑删除用户不会自动处理他在/home之外的文件。账户记录没了但这些文件的属主数字还在于是ls里会出现一串裸 UID# 删除用户前/data 下有一批属于 user02 的文件[rootzhb-m1 ~]# ls -l /data-rw-r--r--.1user02 wheel1024Nov717:20 report.txt# 删除用户后属主显示为一串裸数字原 UID因为 /etc/passwd 里已查不到用户名映射[rootzhb-m1 ~]# userdel user02[rootzhb-m1 ~]# ls -l /data-rw-r--r--.11008wheel1024Nov717:20 report.txt# 找出所有「无主」文件没有对应用户名或组名的[rootzhb-m1 ~]# find / -nouser -o -nogroup 2/dev/null/data/report.txt# 交给 root 接管[rootzhb-m1 ~]# chown root:root /data/report.txt[rootzhb-m1 ~]# ls -l /data-rw-r--r--.1root root1024Nov717:20 report.txt一两个文件这样改没问题但真实环境删一个用户常留下成百上千个文件逐个chown不现实得批量来。无主文件批量接管速查表命令作用说明find 目录 -nouser -exec chown root:root {} 批量改属主为 root会把找到的文件攒起来一次传给 chown效率最高find 目录 -nouser -exec chown root:root {} \;逐个改属主\;是每找到一个执行一次量大时慢find 目录 -nouser | xargs chown root:root配合 xargs 批量改管道写法效果同老系统兼容find 目录 -nouser -print0 | xargs -0 chown root:root安全处理带空格文件名文件名含空格/特殊字符时必须用这对组合find / -uid 1008 -exec chown zhb:zhb {} 按原 UID批量转交给指定用户删用户前先转交比事后兜底干净find / \( -path /proc -o -path /sys \) -prune -o ...跳过伪文件系统全盘扫必加否则 /proc 下会冒出一堆噪音chown 用户名 文件只改属主不动属组与下面一行正好相反chown :组名 文件只改属组不动属主冒号前留空即可补-R可递归整个目录chown 用户:组 文件属主属组一起改用户名和组名都可换成 UID/GID 数字实战批量接管# 无主文件往往不止一个逐个 chown 太蠢用 -exec ... 一把梭[rootzhb-m1 ~]# find /data -nouser -exec chown root:root {} [rootzhb-m1 ~]# ls -l /data-rw-r--r--.1root root1024Nov717:20 report.txt# 等价的 xargs 写法旧系统不支持 find 时用它[rootzhb-m1 ~]# find /data -nouser | xargs chown root:root# 只改属组不改属主比如想把文件交给 webadmin 组共用[rootzhb-m1 ~]# find /data -nogroup -exec chown :webadmin {} # 不是所有文件都该给 root —— 服务数据目录要交回服务账号[rootzhb-m1 ~]# find /data -nouser -exec chown zhb:webadmin {} # 全盘扫要排除 /proc、/sys否则冒出一堆伪文件噪音[rootzhb-m1 ~]# find / \( -path /proc -o -path /sys \) -prune -o \( -nouser -o -nogroup \) -print 2/dev/null动手前先存一份清单find / -nouser -o -nogroup 2/dev/null /tmp/orphan.list再用wc -l看规模。改之前过目一遍确认没有挂载盘、NFS、服务数据目录这类不该动的万一改错了清单就是回滚依据。[!warning]给find追加其他条件时-o两侧必须加圆括号否则优先级会出错# 错误-type f 只作用于后半句-nouser 的目录也会被列出来find/-typef-nouser-o-nogroup# 正确两个条件整体括起来再与 -type f 组合find/\(-nouser-o-nogroup\)-typef处理思路删用户前先用find / -uid 1008把文件找出来归档或转交删完后用find / -nouser兜底扫一遍再用上表命令一次接管。数字属主还有个隐患之后新建的用户若复用同一 UID会自动获得这些旧文件的所有权—— 所以无主文件别放着不管早发现早接管。口诀先-uid找、再删除删完-nouser扫、-exec 一把接管。五、本地组管理用法速查表命令作用示例groupadd 组名创建组groupadd admingroupadd -g GID 组名指定 GID 创建组groupadd -g 2000 sysadmingroupmod -n 新名 组名修改组名groupmod --new-name admins admingroupmod -g GID 组名修改 GIDgroupmod -g 2002 adminsgroupdel 组名删除组groupdel sysadmingroupmems -g 组 -a 用户向组添加成员只 root 可用groupmems -g 组 -d 用户从组移除成员—groupmems -g 组 -l列出组成员—groupmems -g 组 -p清空组成员purge# 创建组[rootzhb-m1 ~]# groupadd admin[rootzhb-m1 ~]# groupadd sysadmin -g 2000[rootzhb-m1 ~]# grep admin /etc/groupprintadmin:x:997: admin:x:1002: sysadmin:x:2000:# 修改组名称、组 ID[rootzhb-m1 ~]# groupmod --new-name admins admin[rootzhb-m1 ~]# groupmod -g 2002 admins[rootzhb-m1 ~]# grep admins /etc/groupadmins:x:2002:# 删除组[rootzhb-m1 ~]# groupdel sysadmin[rootzhb-m1 ~]# grep sysadmin /etc/group# 添加成员[rootzhb-m1 ~]# groupmems -g admins -a zhb[rootzhb-m1 ~]# groupmems -g admins -lzhb[rootzhb-m1 ~]# id zhbuid1000(zhb)gid1000(zhb)组1000(zhb),10(wheel),2002(admins)# 删除成员[rootzhb-m1 ~]# groupmems -g admins -d zhb[rootzhb-m1 ~]# groupmems -g admins -l# 清空组中所有成员[rootzhb-m1 ~]# groupmems -g admins -a zhb[rootzhb-m1 ~]# groupmems -g admins -p删组的前提若某组是某个用户的主组则该组无法删除需先修改用户的主组。本文从 UID/GID 讲起走通了「passwd/group 两大文件 → 用户增删改 → 组管理」这条链路掌握这些就能独立管理一台服务器的账户与权限归属。密码策略、/etc/shadow与故障排查见姊妹篇。觉得有帮助欢迎点赞收藏也欢迎评论区交流疑问。
返回列表