尝试了解 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 支持哪些登录身份验证方法以及如何判断正在使用哪种方法。。