除了 /etc/passwd 之外还有包含/定义我的 UID 的文件吗?

除了 /etc/passwd 之外还有包含/定义我的 UID 的文件吗?

尝试了解 UID 和 GID。
各种在线阅读让我相信我的 UID 保存在 中/etc/passwd,但在我工作的服务器上似乎并非如此:

$ whoami
user1
$ cat /etc/passwd | grep user1
$

除此之外是否还有(其他)文件/etc/passwd可以包含我的 UID?

(我假设 UID 与 GID 类似,因为某个地方有一个文件包含它。我在该文件中找到了我感兴趣的 GID /etc/group

我知道我可以使用命令获取我的UID id -u,但是对于这个问题,我特别有兴趣了解是否有文件包含它的。

答案1

“是”/etc/passwd是存储和查询用户帐户数据库的多种方式之一。

在许多类 Unix 系统中,名称服务开关(最初来自 Solaris)负责使用多种方法将一些系统名称与 ids 相互转换。

它的配置通常存储在/etc/nsswitch.conf.

在那里,您将找到许多数据库的条目以及它们的处理方式(组、密码、服务、主机、网络...)。对于hosts用于将主机名转换为网络协议地址的数据库,您会发现除了/etc/hosts.

当进程请求有关用户名的信息(例如使用getpwnam()标准函数)时,会在该文件中查找要使用的方法以查找passwd条目。

如果是这样的方法files/etc/<db>将会被查找。在 GNU 系统上,这通常是由一些/lib/<system>/libnss_files.so.<version>动态加载的模块完成的。

但您还可以拥有更多,例如 NIS+、LDAP、SQL。其中一些方法包含在 GNU libc 中,一些可以单独安装。在 Debian 或衍生版本上,请参阅apt-cache search 'NSS module'example的输出。

在用户数据库集中的企业环境中,最流行的中央数据库是 NIS,然后是 NIS+,而现在,它是 LDAP 或 Microsoft 的 Active Directory(或其 Unix 的克隆)。

如果存在,get{pw/host/grp}...()GNU libc 的函数也会查询名称服务缓存守护进程via/run/nscd/socket而不是调用整个 NSS 堆栈并直接查询后端数据库。然后查询将由缓存完成,nscd以加快以后的查询速度。一些 NSS 模块也可以自己进行缓存。

在 GNU/Linux 系统上,一种流行的方法是使用系统安全服务( sss)。它带有一个单独的守护进程 ( sssd),用于处理请求并将它们分派到其他数据库(例如 LDAP / AD),同时还进行一些缓存。然后/etc/nsswitch.conf会有一个sss适用于大多数DB的方法,并且后端在sssd配置中进行配置。sssd在这种情况下,PAM(负责身份验证)通常也会进行查询。

这应该有助于澄清为什么在一般情况下从命令行查询/etc/passwd(或/etc/group/etc/hosts...)获取帐户(或组/主机...)信息是错误的。大多数现代系统都会有一个getent命令来代替(也来自 Solaris),或者更方便地,您可以使用perl的接口来访问所有标准get<db>*()功能。

$ getent passwd bin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
$ perl -le 'print for getpwnam("bin")'
bin
x
2
2


bin
/bin
/usr/sbin/nologin
$ getent services domain
domain                53/tcp
$ perl -le 'print for getservbyname("domain", "tcp")'
domain

53
tcp
$ perl -le 'print for getservbyname("domain", "udp")'
domain

53
udp

答案2

技术上是的某处有一些文件其中包含每个给定用户名的 uid。

如果您在 Linux 中创建简单的本地帐户,那么它将位于/etc/passwd之间的字段 #3 中:

但是,如果linux使用ActiveDirectory身份验证,那么它会从另一台服务器获取所有用户名/uid信息,然后将其存储在您的linux系统上的某个[文本]文件中,我不知道,它可能只是存储在内存中;我很有兴趣了解这个细节。

Linux 支持几种登录或身份验证方案,其中之一是 AD,还有 LDAP。我不知道LDAP在哪里存储用户名和uid映射,但我也有兴趣知道。

所以...除了 /etc/passwd 之外还有包含/定义我的 UID 的文件吗? 是的。除了简单的传统本地 /etc/passwd 方法以及正在使用的方法之外,这取决于 linux 支持的所有不同登录/身份验证方法。所以你的下一个问题可能是Linux 支持哪些登录身份验证方法以及如何判断正在使用哪种方法。

相关内容