我们可以通过使用ps
命令来确定进程的所有者。这是否意味着其他用户无法运行/终止/继续该进程?
我们可以通过使用ps
命令来确定进程的所有者。这是否意味着其他用户无法运行/终止/继续该进程?
Answers:
读取凭据(7),fork(2),execve(2)。该系统调用fork是过程的创建方法(在今天,fork
经常与实施克隆(2) ,但你可以看到,作为一个实现细节)。该exec系统调用是这样的可执行程序被启动。请记住,所有操作都是通过某些进程和某些系统调用完成的(在syscalls(2)中列出)。内核在启动时神奇地启动了第一个进程(init或systemd)。fork(2)已启动其他进程。现代的Linux内核有时-但很少-神奇地启动一些特殊工艺(如/sbin/hotplug
)或内核线程(例如kworker
,kswapd
....)。
所以是的,每个进程(和每个文件)都有一些所有者(技术上是uid,一个小的非负数)和组(gid)。0 uid用于root用户,并具有额外的权限。
另请参阅有关setuid(和setreuid(2) ...)的信息。
这是否意味着其他所有者无法运行该进程?
一个进程已经在运行(但是可能处于空闲或等待状态),因此没有人可以再次运行它。不要将进程(动态的)与其中运行的程序(可执行文件,通常为ELF格式)混淆。
给定的程序(例如/bin/bash
)可以在多个过程中执行。许多可执行文件保留在磁盘上,而没有(在给定的瞬间)任何进程运行它们。
在Linux上,proc(5)在查询内核有关进程状态时非常有用。尝试例子cat /proc/$$/status
和cat /proc/self/maps
。另请参阅pgrep(1),ps(1),top(1)。
每个进程都有自己的虚拟地址空间,自己的文件描述符表,自己的工作目录(以及常常有多个线程,请参见pthreads(7))等。
这是否意味着其他所有者无法运行/杀死/恢复该过程?
运行一个进程没有任何意义(它已经在运行)。但是,pid 1234进程的可执行文件可用作/proc/1234/exe
符号链接,您可以将其用于execve(2) -但您可能不应该使用它。execve
适用的权限规则。
要杀死进程(2),通常应具有相同的uid。但是,文档告诉您:
For a process to have permission to send a signal, it must either be privileged (under Linux: have the CAP_KILL capability in the user namespace of the target process), or the real or effective user ID of the sending process must equal the real or saved set-user-ID of the target process. In the case of SIGCONT, it suffices when the sending and receiving processes belong to the same session.
要停止进程,请使用kill(2)所使用的SIGSTOP
(或SIGTSTP
)信号。参见signal(7)。
要恢复已停止的过程,请使用SIGCONT
信号。
所有者通常是启动该过程的用户。该命令可能可由其他用户执行,但这将是一个不同的过程。
这是否意味着其他所有者无法运行该进程?
没有其他所有者。不要混淆程序(可执行文件)和进程(正在运行的程序)。
这是否意味着其他所有者无法运行/终止/继续该过程?
单一所有者已经启动了该过程。如果您是说其他用户,而不是所有者,那要看情况。
根(即uid
等于0 的用户)具有全部权限。uid
从OS的角度来看,共享同一用户的其他用户是同一用户,因此也可以完全控制该进程。
具有不同uid的用户将无法终止/停止/继续该进程,除非允许他们通过sudo
或类似命令切换到所有者或root特权,或者在较小程度上切换到与该进程相关的用户从他们的层次结构。