尝试了解 UID 和 GID。
各种在线阅读让我相信我的 UID 保存在 中/etc/passwd,但在我工作的服务器上似乎并非如此:
$ whoami
user1
$ cat /etc/passwd | grep user1
$
Run Code Online (Sandbox Code Playgroud)
除此之外是否还有(其他)文件/etc/passwd可以包含我的 UID?
(我假设 UID 与 GID 类似,因为某个地方有一个文件包含它。我在该文件中找到了我感兴趣的 GID /etc/group)
我知道我可以使用命令获取我的 UID id -u,但对于这个问题,我特别感兴趣的是了解是否有包含它的文件。
Sté*_*las 22
“是”/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 中,一些可以单独安装。apt-cache search 'NSS module'在 Debian 或衍生版本上,请参阅example的输出。
在用户数据库集中的企业环境中,最流行的中央数据库是 NIS,然后是 NIS+,而现在,它是 LDAP 或 Microsoft 的 Active Directory(或其 Unix 的克隆)。
如果存在,get{pw/host/grp}...()GNU libc 的函数还将通过查询名称服务缓存守护进程/run/nscd/socket,而不是调用整个 NSS 堆栈并直接查询后端数据库。然后查询将由缓存完成,nscd以加快以后的查询速度。一些 NSS 模块也可以自己进行缓存。
在 GNU/Linux 系统上,一种流行的方法是使用系统安全服务( sss)。它带有一个单独的守护进程 ( sssd),用于处理请求并将它们分派到其他数据库(例如 LDAP / AD),同时还进行一些缓存。然后/etc/nsswitch.conf会有一个sss适用于大多数DB的方法,并且在配置中配置后端sssd。在这种情况下,PAM(负责身份验证)通常也会进行查询sssd。
这应该有助于澄清为什么在一般情况下从命令行查询/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
Run Code Online (Sandbox Code Playgroud)
$ 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2837 次 |
| 最近记录: |