什么是进程 GID,它的用途是什么?

Ali*_*cia 7 process permissions

阅读 mod_wsgi 的文档,我发现您可以选择运行工作进程的组。

我可以理解文件的组所有权以及只有属于该组的用户才能获得该文件的组权限,但我不明白这如何适用于正在运行的进程。

那么,什么是进程 GID,它的用途是什么?

slm*_*slm 8

这实际上归结为 Unix 中进程的组成部分。进程可以通过以下两种方式之一产生。通过fork()函数或通过exec()C中的函数之一。

fork()

fork()基本上只是制作当前进程的副本,但为其分配一个新的进程 ID (PID)。它是原始进程的子进程。您可以在以下输出中看到这种关系ps

$ ps axjf
 PPID   PID  PGID   SID TTY      TPGID STAT   UID   TIME COMMAND
    1  5255  1964  1964 ?           -1 Sl     500   0:39 gnome-terminal
 5255  5259  1964  1964 ?           -1 S      500   0:00  \_ gnome-pty-helper
 5255 18422 18422 18422 pts/1    18422 Ss+    500   0:01  \_ bash
 5255 30473 30473 30473 pts/4    30473 Ss+    500   0:00  \_ bash
30473   782   782 30473 pts/4    30473 Sl     500   1:14  |   \_ evince s.pdf
Run Code Online (Sandbox Code Playgroud)

在这里您可以看到这gnome-terminal是父进程(PID = 5255),bash它是子进程(PID = 18422,PPID = 5255)。

注意: PPID = 父进程 ID。

当进程从其父进程派生时,它“继承”某些东西,例如父进程当前拥有的所有文件描述符的副本,用于打开文件以及父进程的用户和组 ID。

注意:最后 2 个用于标识此进程在访问文件系统时将拥有的文件和组权限。

因此,如果一个进程只是从其父进程继承其用户和组 ID,那么为什么不是所有内容都由 root 或单个用户拥有?这是exec()进来的地方。

exec() 第1部分

exec()系列函数特别execve()是用新的过程映像“替换”当前的过程映像。术语“进程映像”实际上只是一个文件,即磁盘上的可执行文件。这就是 bash 脚本如何执行诸如/usr/bin/time.

那么用户 ID 和组 ID 呢?好理解,让我们首先讨论“角色”的概念。

人格魅力

在任何时候,每个进程都有一个有效的用户 ID、一个有效的组 ID 和一组补充组 ID。这些 ID 决定了进程的权限。他们统称为进程角色,因为他们为了访问控制的目的确定“它是谁”。

exec() 第2部分

因此,除了能够换出“过程映像”之外,exec()还可以将用户和组 ID 从原来的“真实” ID 更改为“有效” ID。

一个例子

在本演示中,我将向您展示当我们在 shell 中作为我们的默认 UID/GID 开始时会发生什么,然后使用我的一个补充 GID 生成一个子 shell,使其成为子 shell 的有效 GID。

要执行此操作,我将使用 unix 命令newgrpnewgrp允许您生成一个新的 shell,将它传递给我想要使我的有效 GID 的补充组。

对于初学者:

$ id -a
uid=500(saml) gid=501(saml) groups=501(saml),502(vboxusers),503(jupiter)
Run Code Online (Sandbox Code Playgroud)

我们可以看到这个 shell 当前配置了我的默认 UID/GID saml& saml。触摸一些文件表明情况也是如此:

$ touch afile1
$ touch afile2
$ ls -l
total 0
-rw-rw-r-- 1 saml saml 0 May 21 23:47 afile1
-rw-rw-r-- 1 saml saml 0 May 21 23:47 afile2
Run Code Online (Sandbox Code Playgroud)

现在我们使我们的补充组成jupiter为有效的 GID:

$ newgrp jupiter
$ id -a
uid=500(saml) gid=503(jupiter) groups=501(saml),502(vboxusers),503(jupiter)
Run Code Online (Sandbox Code Playgroud)

现在,如果我们触摸一些文件:

$ touch afile3
$ touch afile4
$ ls -l
total 0
-rw-rw-r-- 1 saml saml    0 May 21 23:47 afile1
-rw-rw-r-- 1 saml saml    0 May 21 23:47 afile2
-rw-r--r-- 1 saml jupiter 0 May 21 23:49 afile3
-rw-r--r-- 1 saml jupiter 0 May 21 23:49 afile4
Run Code Online (Sandbox Code Playgroud)

我们看到,外壳的有效GID是jupiter,所以与正在创建与文件的磁盘造成的任何互动jupiter,而不是我的正常的默认组saml

参考