我正在编写一些测试代码,我想知道如果假设 UID 1 的用户在所有 Unix 系统上都被命名为“daemon”,它是否可以移植?
编辑:如果没有(答案似乎是否定的),是否有任何 UID/用户名映射是跨 Unices 一致(除了我已经在使用的 0/root 之外)?
答案1
不,并非所有地方都是如此。在 CentOS 7 系统上,摘自/etc/passwd
:
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
在 Linux 上,您可以使用getent passwd daemon
来查找用户的 UID daemon
,并getent passwd 1
查找哪个用户的 UID 为 1。
答案2
不。对于 Linux,bin
并且daemon
交换了位置 -bin
曾经是#1 和daemon
#2。在 Minix 上,#1/bin 实际上曾经被操作系统内核授予半特权(即有点像 #0/root)。在 Solaris 上,UID #1 称为daemon
,而 GID #1 称为others
- 这是新用户的默认组(除了在安装过程中使用 -“角色”创建的用户外root
,他属于staff
-组)。
UID #0 当然是root
... GID #0 通常是root
或wheel
。
我认为唯一必需的用户和组是#0。然而,强烈建议也有一个bin
和daemon
组 - 拥有//bin 和 //sbin。然后你经常可以sys
拥有各种系统文件和目录 - 特别是 /dev (在 Linux 中,设备现在通常由 root 拥有,并且不同组的设备有许多不同的组......只有 /dev/random、/dev/null在其他操作系统(如 Solaris)上,/dev/zero 通常仍sys
作为组获得sys:sys
。通常,您会adm
成为各种日志的所有者和组(最初位于 /usr/adm),有时会运行 syslog。通常有一个man
用户/组拥有手册页。
operator
用户和/或组适用于那些被允许在控制台工作的人 - 即。终端直接连接到上锁的机房中的计算机。它经常运行备份,因此通常是该root
组的成员来访问(几乎)所有内容。 staff
是一个用于“初级管理员”的组,可能允许控制 /home 并添加本地用户。
最后,我们得到了一系列用户:组对,用于各种常见的以及在某种程度上所需的服务...有些现在不常见:lp
=打印机,news
=网络新闻(NNTP)公告板,mail
=(本地)邮件服务,uucp
= Unix to Unix CoPy...一种将邮件和新闻组帖子等内容打包在一起,并将其“复制”到远程 Unix 机器的方法。当人们主要使用拨号时经常使用。 tty
= TeleTYpe...拥有各种终端。
许多人还有games
用户。需要直接访问声卡和视频卡等内容的游戏,以该用户(游戏)运行 SetUID...并且 -usergame
已添加到该硬件的组中。这样,游戏就可以获得对硬件所需的访问权限,而不必以完全 root 访问权限(即 SetUID=root)运行。它还允许在系统上的所有用户之间共享“最高分”列表等。
答案3
不,这不一定是便携式的。任何本地安装都可以自由更改任何 UID/名称对(尽管通常不建议这样做)。
为了可移植性,您应该始终使用操作系统的函数来转换数字/符号用户和组标识符(uid
和gid
)。
如果您关心数字用户 ID ( uid
) 2,则使用获取并返回数字组 ID 的命令和系统调用。必要时,使用getent
命令或类似命令将数字转换为符号。
如果您关心用户,daemon
则在执行用户操作时使用符号字符串daemon
,或者在将 传递给命令或函数之前获取uid
指定用户的daemon
(再次,来自getent
例如) 。uid
许多命令(例如ls
和 )find
包含用于处理符号组名称和数字组标识符的选项。其他命令例如getent
可用于转换为/从