为什么Unix newgrp命令存在(某种意义上)

2020-10-11 16:13:11

你知道#Unix组有密码吗?显然,如果您设置了一个,那么您就必须使用newgrp登录到该组。

关于这一点有一些要说的,但是您可能首先想知道为什么newgrp命令会存在。最好的答案是,它基本上是Unix的历史遗迹(或者,换一种说法,是化石)。

基本上,在当前的所有UNIX中,进程一次可以在多个组中,通常是很多个。然而,这是BSD中添加的一个功能,在最初的Research unix(包括V7)中并不是这样,在很长一段时间内,System V也不是这样。在这些UNIX中,您可以被列为/etc/groups中不同组的成员,但是给定的进程一次只在一个组中。newgrp命令是您在组之间来回切换的方式。

一般来说,在给定Unix的情况下,newgrp的工作方式与您预期的一样。它是一个setuid根程序,它将自身切换到新组中,然后执行程序进入您的shell(在小心地放弃setuid权限之后)。

(newgrp在V7中的实际行为是一个有趣的话题,但这是另一个条目的内容。)。

据我从tuhs.org可以看出,在Research UnixV6中出现了newgrp命令,但它似乎不在V5中。不过,您本可以编写一个setgid()系统调用,因为早在V4中就有一个setgid()系统调用(而V4可能就是发明组概念的地方)。令我有些惊讶的是,组密码的存在也可以追溯到V6Unix。

(在我开始调查这件事之前,我会猜到分组密码是在AT&;TUnix的System III/System V系列中的某个地方添加的,因为AT&;T将其用于生产用途。)。

PS:我很高兴看到OpenBSD似乎在某个时候放弃了newgrp命令。Linux和FreeBSD都继续拥有它,我无法想象Illumos、Solaris或任何其他幸存下来的商业Unix也会抛弃它。