Linux

程序可以有所有者嗎?這是什麼意思?

  • November 12, 2017

ps我們可以通過使用命令來確定一個程序的所有者。這是否意味著其他使用者無法執行/殺死/恢復該程序?

讀取憑證(7)fork(2)execve(2)fork 系統呼叫是創建程序的方式(今天,通常fork使用clone(2)實現,但您可以將其視為實現細節)。exec 系統呼叫是啟動可執行程序的方式。請記住,一切都是通過一些系統呼叫(列在syscalls(2)中)的某個程序完成的。第一個程序(initsystemd)已由核心在引導時神奇地啟動。其他程序已被fork(2)啟動. 現代 Linux 核心有時(但很少)會神奇地啟動一些特殊程序(例如/sbin/hotplug)或核心執行緒(例如kworker…. kswapd)。

所以是的,每個程序(和每個文件)都有一些所有者(技術上是uid,一個小的非負數)和組(gid)。0 uid 用於 root 並具有額外的權限。

另請閱讀有關setuid(和setreuid(2) …)的內容,這很棘手。

這是否意味著其他所有者無法執行該程序?

一個程序已經在執行(但它可能處於空閒或等待狀態),因此沒有人可以再次執行它。不要將程序(動態的)與在其中執行的程序(可執行文件,通常為ELF格式)混淆。

一個給定的程序(例如/bin/bash)可以在幾個程序中執行。許多執行檔保留在您的磁碟上,而沒有(在給定時刻)任何執行它們的程序。

在 Linux 上,proc(5)對於向核心查詢程序狀態非常有用。嘗試範例cat /proc/$$/statuscat /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一起使用的(or SIGTSTP) 信號。見信號(7)

恢復停止的程序,請使用SIGCONT信號。

引用自:https://unix.stackexchange.com/questions/404063