尝试了解 UID 和 GID。
各种在线阅读使我相信我的 UID 保存在 中/etc/passwd
,但在我工作的服务器上似乎并非如此:
$ whoami
user1
$ cat /etc/passwd | grep user1
$
除此之外是否有(其他)文件/etc/passwd
可以包含我的 UID?
(我假设 UID 与 GID 相似,因为在某处有一个文件包含它。我在文件中找到了我感兴趣的 GID /etc/group
)
我知道我可以使用 command 获取我的 UID id -u
,但是对于这个问题,我特别有兴趣了解是否存在包含它的文件。
Yes
/etc/passwd
是存储和查询用户帐户数据库的多种方式之一。在许多类 Unix 系统中,名称服务开关(最初来自 Solaris)负责使用多种方法将一些系统名称与 id 进行转换。
它的配置通常存储在
/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'
例如的输出。在用户数据库集中的企业环境中,最流行的中央数据库是 NIS,然后是 NIS+,而如今,它更像是 LDAP 或 Microsoft 的 Active Directory(或它的 Unix 克隆)。
如果存在,
get{pw/host/grp}...()
GNU libc 的功能还将查询名称服务缓存守护进程,/run/nscd/socket
而不是调用整个 NSS 堆栈并直接查询后端 DB。然后查询将由完成nscd
并缓存以加快以后的查询。一些 NSS 模块也可以自己进行缓存。在 GNU/Linux 系统上,一种流行的方法是使用系统安全服务(
sss
)。它带有一个单独的守护进程 (sssd
),它处理请求并将它们发送到其他数据库(例如 LDAP / AD),同时还进行一些缓存。然后/etc/nsswitch.conf
会有一个sss
适用于大多数数据库的方法,并且在配置中sssd
配置了后端。在这种情况下, PAM(负责身份验证)通常也会进行查询sssd
。这应该有助于澄清为什么在一般情况下从命令行查询
/etc/passwd
(或/etc/group
或...)以获取帐户(或组/主机...)信息是错误的。/etc/hosts
大多数现代系统都会有一个getent
命令来代替它(也来自 Solaris),或者更便携,您可以使用perl
' 接口来访问所有标准get<db>*()
功能。从技术上讲是的,某处有一些文件包含每个给定用户名的 uid。
如果您在 linux 中创建简单的本地帐户,那么它将位于's
/etc/passwd
之间的字段 #3 中。:
但是如果 linux 使用 ActiveDirectory 身份验证,那么它将从另一台服务器获取所有用户名/uid 信息,然后存储在你的 linux 系统上的某个 [text] 文件中,我不知道,它可能只是存储在内存中;我很想知道这个细节。
linux 支持一些登录或身份验证方案,其中之一是 AD,还有 LDAP。LDAP 存储用户名和 uid 映射的位置我不知道,但我也有兴趣知道。
所以...除了 /etc/passwd 之外是否还有一个文件包含/定义了我的 UID? 是的。它取决于 linux 支持的所有不同登录/身份验证方法,除了简单的传统本地 /etc/passwd 方法和正在使用的方法。所以你的下一个问题可能是linux 支持的所有登录身份验证方法是什么,我如何判断正在使用哪些。.