以下命令将列出someUser
(主要组和补充组)的所有组:
groups someUser
Run Code Online (Sandbox Code Playgroud)
但是有没有办法只获得主要群体?
还有在shell变量一样$0
,$1
,$2
,$?
,等。
我尝试使用以下命令打印 shell 和环境变量:
set
Run Code Online (Sandbox Code Playgroud)
但是这些变量不在列表中。
所以基本上这些变量不被认为是shell/环境变量,对吧?(即使要输出它们,您也必须在它们前面加上$
,就像使用 shell/环境变量一样)
我读到会话的 ID 与通过setsid()
系统调用创建会话的进程的 pid 相同,但我没有找到有关如何设置进程组 ID 的任何信息。进程组 ID 是否与创建进程组的进程的 pid 相同?
根据我对 Linux 中伪终端的了解,有两种类型的伪终端:BSD 风格的伪终端(已弃用)和UNIX 98 伪终端。
我创建了两个图像来展示我对这两种伪终端的理解。
下图显示了 BSD 风格的伪终端是如何工作的(如果图片有误,请指正):
这种类型的伪终端不难理解,每个终端都连接到一个唯一的主驱动程序。
但是在 UNIX 98 伪终端中,事情有点混乱。下图显示了我认为这种类型的伪终端是如何工作的:
所以基本上所有终端都使用相同的主驱动程序 ( /dev/ptmx
),但我不确定主驱动程序如何知道如何执行以下操作:
如果数据是从终端进程之一发送的,主驱动程序如何知道数据应该传递给哪个 TTY 从属驱动程序?
如果数据是从 TTY 从驱动程序之一发送的,主驱动程序如何知道数据应该传递到哪个终端进程?
主驱动程序是否知道如何以我在图像中显示的方式执行此操作(即主驱动程序有一个映射表,将每个终端 PID 映射到其相应的 TTY 从驱动程序)?
Linux在权限检查中使用文件系统用户 ID ( fsuid
) 代替有效用户 ID ( euid
),使用文件系统组 ID ( fsgid
) 代替有效组 ID ( egid
)。
Linux 是类 Unix/Unix 操作系统中唯一使用fsuid
和 的操作系统fsgid
吗?例如,像 BSD、macOS、Solaris 这样的操作系统是否使用fsuid
和fsgid
?
在 Linux 中,终端与 Shell 相关联。终端向外壳发送输入(例如:)pwd
,外壳将输出发送回终端(例如:)/home/paul
。
此图显示了终端和外壳之间的关系(假设我使用的终端是gnome-terminal
,而外壳是bash
):
现在我想知道终端和Shell使用什么机制来交换数据。这就是我认为会发生的事情:
gnome-terminal
被执行时,它会创建表示在串行端口的文件/dev/pts
目录(假设文件名是/dev/pts/0
)。gnome-terminal
然后将执行与其关联的 Shell(例如bash
:),并将 pts 文件名传递给它(例如,可以通过命令行参数传递 pts 文件名)。gnome-terminal
并bash
会开始阅读/dev/pts/0
。gnome-terminal
要向 发送数据时bash
,它会将数据写入/dev/pts/0
,并bash
从中读取数据/dev/pts/0
。bash
要向 发送数据时gnome-terminal
,它会将这些数据写入/dev/pts/0
,and
gnome-terminal
从 中读取这些数据/dev/pts/0
。这张图显示了我刚刚解释的内容:
我的理解正确吗?
注意:当然,如果我们使用虚拟终端(即当我们不使用 GUI 时),pts 文件可能是一个 tty 文件,但逻辑仍然是相同的。
我试图了解 Xorg 的工作原理。
我创建了下图来显示我的理解(此图显示了按 Ctrl+Alt+F7 后组件的状态):
下面是对图片的解释:
/dev/tty7
是 Xorg 的控制终端。我的理解正确吗?
该adduser
命令创建一个新用户,同时创建一个新组并使这个新组成为新用户的主要组。
根据我的测试,创建的组adduser
与用户创建的名称相同。但情况总是如此,还是在某些情况下组会具有不同的名称?
根据我的理解,当bash
(或任何进程,只要我不故意更改此行为)运行时,它将(以及其他信息)具有登录用户的补充组列表。
以下是ps
补充组的结果bash
:
PID COMMAND SUPGRP
1409 bash adm dialout cdrom plugdev lpadmin admin sambashare chris
Run Code Online (Sandbox Code Playgroud)
chris
是登录用户的主要组,为什么它被列为补充组的一部分?
Linux没有把“根”用户为超级用户了,而Linux使用功能,这给进程权限(我认为BSD做了类似的事情)。
因此,例如在较旧的 Linux 版本中,如果进程的EUID
(或FSUID
不确定)是“root”,Linux 将允许进程创建套接字,但在现代 Linux 版本中,Linux 将允许进程创建套接字仅当进程具有允许进程创建套接字所需的权限。
但我想知道,是否有一些 Unix 或类 Unix 操作系统仍然将“root”用户视为超级用户?