getent

关注
义项:Linux 名称服务查询命令
getent

getent是类 Unix 系统中用于从名称服务切换(Name Service Switch, NSS)所支持的各类数据库里读取条目的命令行工具, 它由 GNU C 库(glibc)提供, 按 /etc/nsswitch.conf 的配置决定去哪里查询。与直接读取 /etc/passwd、/etc/hosts 等本地文件的做法不同, getent 会走与应用程序相同的查询路径, 因此能把本地文件、LDAP、NIS、DNS 等来源的合并结果一并显示出来, 常用于核对系统实际看到的用户、组、主机与网络服务信息[1][2]。

百科 图文
目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

getent 是 GNU C 库附带的一个用户命令, 其名称来自 get entries 的缩写, 作用是把名称服务切换机制所支持的数据库条目打印到标准输出[1]。它的调用形式为 getent [选项] 数据库 键, 其中数据库名与键都是位置参数, 键可以给出一个或多个, 也可以省略[2]。

它支持哪些数据库、每种数据库优先向哪个来源查询, 都由 /etc/nsswitch.conf 这一配置文件决定, 命令本身并不指定后端[3]。正因如此, getent 的查询结果与依赖同一套 NSS 接口的程序保持一致, 可以当作检验系统名称解析配置是否生效的手段[4]。

原理

名称服务切换是一层把应用程序与具体数据来源隔开的接口。程序调用 getpwnam、getgrgid、getaddrinfo 等标准函数后, glibc 会读取 /etc/nsswitch.conf 中对应的行, 按顺序尝试该行列出的各个服务模块, 直到某个模块给出结果[1]。getent 本身也是这些函数的调用者, 它把命令行给出的数据库名和键翻译成相应的库函数调用, 再把返回值格式化输出[2]。

对于每个数据库, getent 遵循两种工作方式。给出键时执行按键查找, 例如把数值键交给 getpwuid、非数值键交给 getpwnam; 不给键时执行枚举, 即通过 setpwent、getpwent、endpwent 这一组函数把整张表逐条列出[5]。枚举并非对所有数据库都成立, 例如 ethers 与 initgroups 就不支持枚举, 使用这两个库时必须提供键, netgroup 则要求提供 1 个或 3 个键[1]。

命令的退出码反映了查询过程的不同结果: 0 表示成功, 1 表示缺少参数或数据库名无法识别, 2 表示给出的键在数据库中找不到, 3 表示该数据库不支持枚举[2]。这些取值使 getent 可以被脚本用作条件判断。

发展历程

getent 随 GNU C 库一同发布和演进, 其功能变化通常以 glibc 版本号标注。用于覆盖全部数据库后端的 -s service 选项自 glibc 2.2.5 起可用, 只覆盖指定数据库的 -s database:service 形式则自 glibc 2.4 起加入, 该选项可以重复书写, 但每个数据库只采用最后一次指定的服务[3]。

禁止在 ahosts 查询中使用国际化域名编码的 -i 或 --no-idn 选项自 glibc 2.13 起提供[2]。getent 的手册页属于 Linux man-pages 项目, 由该项目随内核与 C 库用户空间接口文档一并维护, 早期版本的页面署名为 2011 年, 后续有多位维护者参与修订[6]。

应用

最常见的用途是核对用户名与用户标识的对应关系。执行 getent passwd 可以列出系统当前能看到的全部账户, 附带某个用户名或 UID 则只输出匹配的那一条记录, 这与只读本地文件的做法不同, 能把来自远程目录服务的账户一并纳入[1]。类似的用法还有用 getent group 检查组成员关系, 用 getent shadow 或 getent gshadow 查看口令与组口令的影子条目[7]。

在网络排错方面, getent hosts 与 getent ahosts 用来验证主机名解析。前者按 gethostbyname2 或 gethostbyaddr 的路径查询, 后者走 getaddrinfo 并返回套接字地址结构, 二者的差异有助于判断问题出在 hosts 文件、DNS 还是地址族选择上; 在 ahostsv4 与 ahostsv6 中还可以限定只使用 IPv4 或 IPv6 地址族[2]。此外, getent services、getent protocols、getent networks 与 getent rpc 分别用于查端口服务名、协议编号、网络名和远程过程调用映射[5]。

在配置远程认证或目录服务时, 管理员常用 getent 验证 /etc/nsswitch.conf 的改动是否被系统接受: 如果某一数据库的查询结果与预期不符, 通常说明该行对应的服务模块未安装、未启用或顺序不当[4]。

局限

getent 只是 NSS 接口的一层包装, 因此它的能力上限由配置与已安装的模块决定, 并不比调用同一接口的应用程序看到更多信息[1]。对不接受枚举的数据库, 不带键调用会以退出码 3 结束, 无法像遍历本地文件那样取得全量列表[2]。

由于输出内容直接来自系统所配置的名称服务, 其中可能包含口令哈希、组成员与主机映射等敏感字段, 其可见范围受进程权限约束[7]。部分数据库在远程后端下返回速度取决于网络与目录服务器状态, 不带键的大范围枚举可能产生较高的查询开销。此外, 该命令的选项集合由 glibc 版本决定, 较旧的系统并不支持 -i 等较晚加入的选项[3]。

参见

  • 名称服务切换 —— getent 查询所依据的配置机制, 决定每个数据库的查询来源与顺序

  • glibc —— 提供 getent 命令及其调用的名称查询函数库

  • /etc/nsswitch.conf —— 定义各数据库使用哪些后端服务的配置文件

  • passwd —— getent 可查询的用户账户数据库

  • hosts —— getent 可查询的主机名与地址映射

  • DNS —— 名称服务切换中常用的主机名解析后端之一

参考资料

  1. getent.1.en [引用日期2026-10-14]
  2. getent(1) — Linux manual page [引用日期2026-10-14]
  3. getent.1 [引用日期2026-10-14]
  4. GETENT [引用日期2026-10-14]
  5. getent(1) — manpages — Debian unstable [引用日期2026-10-14]
  6. getent [引用日期2026-10-14]
  7. getent [引用日期2026-10-14]
词条评价
词条统计

浏览次数:2 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-13T18:36:04Z

历史版本

本条目引用的词条
名称服务切换 glibc /etc/nsswitch.conf passwd hosts DNS