Linux 用户、组与文件所有权:UID、GID 和当前会话查询
Linux 为账户分配用户 ID(UID),为组分配组 ID(GID),文件则记录所属用户和所属组。账户可以有一个主组和若干附加组,使用 id、groups、getent 和 ls -l 可以查看这些关系。本课重点是读懂信息,不修改账户或文件所有者。
账户与组信息是理解文件所有者与访问权限(英语)的基础。排查权限问题前,还应区分账户数据库中的设置与当前登录会话实际使用的组。
用户 ID 和组 ID 代表什么?
learner 等便于人阅读的用户名对应数字 UID,组也有名称和数字 GID。主组是账户资料中指定的主要组,附加组是额外加入的组。访问判断还取决于文件所有者、所属组、权限位以及其他系统规则;加入某组不意味着能读写该组拥有的所有文件。
管理员账户 root 的 UID 为 0。普通用户或组的 ID 不一定从 1000 开始,实际范围取决于系统与账户创建策略,不能根据示例数字推断本机配置。
查看当前会话的用户与组
以下命令可由普通用户执行,不改变账户。id 显示当前进程的用户与组名称及数字 ID;id -un 输出有效用户名称,id -gn 输出有效组名称,id -nG 输出当前进程组列表中的名称。
id
id -un
id -gn
id -nG
groups
说明性结果可能是 uid=1000(learner) gid=1000(learner) groups=1000(learner),10(wheel),本机名称和数字通常不同。在普通、未切换身份的登录环境中,gid=... 通常对应主组,groups=... 显示当前上下文的组列表。严格说,id -g 默认查询有效 GID;进程身份经过切换时,不应把它直接等同于账户数据库记录的主组。
groups 以较简短的形式显示当前组名称。管理员刚调整组成员关系后,已打开的会话可能仍保留旧组列表,因为进程使用的是已有身份信息。通常需要重新登录以建立具有新组列表的会话;只在原会话中再开一个普通子 Shell,不能假定它会重新读取登录组配置。
通过 getent 查询账户资料
getent 通过名称服务切换机制(Name Service Switch,NSS)查询账户与组数据库。配置可能包含本地文件或外部目录服务,因此它比单独读取 /etc/passwd 更能反映系统实际的名称查询方式。下面按当前有效用户名称与有效组名称查询对应记录;在普通登录环境中,它们通常就是当前账户与主组。
getent passwd "$(id -un)"
getent group "$(id -gn)"
getent passwd 的一条常见记录由冒号分隔七个字段:名称、密码字段、UID、主 GID、说明、主目录、登录 Shell。现代使用影子密码的系统中,密码字段通常是 x 等占位内容,这不表示明文密码会显示在此处。getent group 则返回组名、GID 和成员列表等信息。
组记录的成员列表不一定列出所有以该组为主组的用户,不能仅凭该列表判断一个用户的全部组关系。对照账户记录和 id 的当前进程信息,才能区分配置与会话状态。最小安装环境可能没有 getent,此时应查看已安装 C 库或发行版提供的查询工具,不要为修改账户而随意直接编辑 /etc/passwd 或 /etc/group。
读懂文件的所有者与所属组
在新建的空练习目录中创建文件。若 ~/linux-course-16-practice 已存在,请换名并相应调整路径。逐条执行;mkdir 或 cd 失败就停止,先用 pwd 确认位置。不要在已有文件目录中继续,因为 touch 对已存在的文件可能改变时间戳。
mkdir ~/linux-course-16-practice
cd ~/linux-course-16-practice
pwd
touch own.txt
ls -l own.txt
ls -l 输出中,权限和链接数后面的两个名称通常分别是所有者与所属组。新文件通常由创建它的当前用户拥有,但组选择还可能受父目录设置和文件系统行为影响,不能一概断定等于账户主组。文件大小、时间与显示名称也应以实际结果为准。
GNU stat 可将名称与数字 ID 放在同一行比较:%U/%G 分别表示所属用户和组名称,%u/%g 表示数字 UID 和 GID。
stat -c '%U | %G | %u | %g | %n' own.txt
结果可能类似 learner | learner | 1000 | 1000 | own.txt,这是格式示例,不是固定输出。若名称无法解析,还应结合数字 ID 和系统查询配置判断。所有权记录“文件属于谁”,权限描述“允许做什么”,两者是不同信息。本课仅创建自己的练习文件并读取属性,不运行会改变所有者的 chown。
避免混淆三组概念
- 用户名与 UID:名称便于显示和查询,文件系统还使用数字 ID。
- 主组与附加组:账户指定的主组不等于当前会话全部组关系;特殊身份切换还可能改变有效组。
- 账户资料与当前会话:数据库变更不一定更新已经运行的进程,需要检查实际生效的组。
遇到访问问题时,先用 id 确认当前身份和组,再用 ls -l 或 stat 读取目标文件的所有者与组,比较这些信息后再调查权限设置。不要仅因名称看起来相同就直接修改所有权。
官方文档
man7 托管的上游 GNU id(1) 与 stat(1) 手册说明查询选项和格式。账户查询路径见 getent(1) 和 nsswitch.conf(5);账户字段及进程身份继承分别见 passwd(5) 和 credentials(7)。




