[英]How and when does `exec` change the effective user ID, when the set-user-ID is set for the executable file
[英]How to determine the effective user id of a process in Rust?
在 Linux 和其他 POSIX 系統上,程序可以在另一個用戶的身份(即euid
)下執行。 通常,您會調用geteuid
和朋友來可靠地確定進程的當前身份。 但是,我無法找到一種可靠的方法來僅使用 rust 的標准庫來確定這些身份。
我發現唯一接近的是std::os::unix::MetadataExt
。
目前是否可以使用 rust 的標准庫來確定進程的euid
(和其他 id)? 是否有我缺少的功能或特征?
這將取決於特定於操作系統的依賴項,因為對於您可以為其構建 Rust 代碼的大多數目標,該概念不存在(或按照您的想法行事!)。 特別是,您將在此找到libc
箱子,這就是,顧名思義,在一個非常小包裝libc
。
std::os
命名空間通常僅限於為std::process
、 std::thread
和std::fs
模塊獲取進程和 FS 功能的最低限度。 因此,它不會在那里。 出於類似的原因, MetadataExt
目標是文件系統的使用。
正如您所料,調用本身毫無想象力地是geteuid
。
這是一個不安全的extern
導入,因此您必須將其包裝在一個unsafe
塊中。
Rust 1.46.0 似乎沒有在標准庫中公開這個功能。 如果您使用的是 POSIX 系統並且不想依賴額外的依賴項,您有四個選項:
您可以直接使用 libc:
#[link(name = "c")] extern "C" { fn geteuid() -> u32; fn getegid() -> u32; }
如果您特別使用 GNU/Linux,則根本不需要鏈接到 libc,因為系統調用符號會通過 VDSO 自動提供給您的程序。 換句話說,您可以使用沒有link
屬性的普通extern
塊。
讀取/proc/self/status
(可能僅適用於 Linux?)。 該文件包含一行以Uid:
開頭的行。 此行列出了真實用戶 ID、有效用戶 ID 以及您可能會發現的其他相關信息。 有關更多信息,請參閱man proc
。
如果您使用的是普通的 GNU/Linux 系統,您可以訪問/proc/self
目錄本身的元數據。 正如在這個問題中所指出的,這個目錄的所有者應該與進程的有效用戶 ID 相匹配。 您可以按如下方式獲取 euid:
use std::os::unix::fs::MetadataExt; println!("metadata for {:?}", std::fs::metadata("/proc/self").map(|m| m.uid()));
這種方法提供的一個好處是它與選項 #2 相比相對便宜,因為它只是一個單一的stat
系統調用(與打開文件並讀取/解析其內容相反)。
如果您沒有使用普通的 GNU/Linux 系統,您可能會成功地創建一個新的虛擬文件並通過Metadata
正常獲取所有者 ID。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.