![什么是进程 GID 以及它的用途是什么?](https://linux22.com/image/32087/%E4%BB%80%E4%B9%88%E6%98%AF%E8%BF%9B%E7%A8%8B%20GID%20%E4%BB%A5%E5%8F%8A%E5%AE%83%E7%9A%84%E7%94%A8%E9%80%94%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
阅读 mod_wsgi 的文档,我发现您可以选择运行工作进程的组。
我可以理解文件的组所有权以及如何只有属于该组的用户才能获得该文件的组权限,但我不明白这如何应用于正在运行的进程。
那么,什么是进程 GID 以及它的用途是什么?
答案1
这实际上取决于 Unix 中进程的组成部分。流程可以通过以下两种方式之一形成。通过该函数或通过C 中的函数fork()
之一。exec()
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
在这里您可以看到这gnome-terminal
是父进程(PID = 5255),这bash
是它的子进程(PID = 18422,PPID = 5255)。
笔记:PPID = 父进程 ID。
当一个进程从其父进程派生时,它会“继承”某些内容,例如父进程当前具有的打开文件的所有文件描述符的副本以及父进程的用户和组 ID。
笔记:最后两个是确定该进程在访问文件系统时将具有哪些文件和组权限的内容。
因此,如果一个进程只是从其父进程继承其用户和组 ID,那么为什么所有内容不都只归 root 或单个用户所有呢?这就是切入点exec()
。
exec()
第1部分
具体来说,该exec()
函数系列execve()
用新的过程映像“替换”当前的过程映像。术语“进程映像”实际上只是一个文件,即磁盘上的可执行文件。这就是 bash 脚本执行诸如/usr/bin/time
.
那么用户ID和组ID呢?好理解了,我们先来讨论一下“Persona”的概念。
人格面具
在任何时候,每个进程都有一个有效的用户ID、一个有效的组ID和一组补充组ID。这些ID决定了进程的权限。他们统称为过程的角色,因为他们出于访问控制的目的确定“是谁”。
exec()
第2部分
因此,除了能够交换“过程映像”之外,exec()
还可以将用户和组ID从原来的“真实”ID更改为“有效”ID。
一个例子
在本演示中,我将向您展示当我们在 shell 中作为默认 UID/GID 开始,然后使用我的补充 GID 之一生成子 shell,使其成为子 shell 的有效 GID 时会发生什么。
为了执行此操作,我将使用 unix 命令newgrp
。newgrp
允许您生成一个新的 shell,并将其传递给我想要作为有效 GID 的补充组。
对于初学者:
$ id -a
uid=500(saml) gid=501(saml) groups=501(saml),502(vboxusers),503(jupiter)
我们可以看到这个 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
现在我们将补充组设为jupiter
有效 GID:
$ newgrp jupiter
$ id -a
uid=500(saml) gid=503(jupiter) groups=501(saml),502(vboxusers),503(jupiter)
现在,如果我们触摸一些文件:
$ 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
我们看到 shell 的有效 GID 是jupiter
,因此与磁盘的任何交互都会导致创建文件,jupiter
而不是我正常的默认组saml
.
参考
答案2
用户不访问文件(他们仅键入、移动并单击鼠标)。只有进程可以访问文件。用户启动一个进程,并且该进程具有与该用户关联的权限(包括其主要组和补充组)。
答案3
进程的权限基于进程的属性。它不直接基于/etc/passwd
和中的条目/etc/group
。这些文件仅在用户登录时才会被读取;它们确定会话初始进程运行时使用的 uid 和 gid。同一会话中的后续进程(该初始进程的子进程或更一般的后代)继承这些 uid 和 gid(除了setuid/setgid程式)。
在大多数情况下,进程的 gids 决定该进程可以访问哪些文件。如果进程的 uid 是文件的所有者,则应用所有者权限;否则,如果进程的 gid(有效或补充)之一是文件的组所有者,则应用组权限;否则,“其他”权限适用。