簡體   English   中英

如何在 Rust 中確定進程的有效用戶 ID?

[英]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::processstd::threadstd::fs模塊獲取進程和 FS 功能的最低限度。 因此,它不會在那里。 出於類似的原因, MetadataExt目標是文件系統的使用。

正如您所料,調用本身毫無想象力地是geteuid

這是一個不安全的extern導入,因此您必須將其包裝在一個unsafe塊中。

Rust 1.46.0 似乎沒有在標准庫中公開這個功能。 如果您使用的是 POSIX 系統並且不想依賴額外的依賴項,您有四個選項:

  1. 您可以直接使用 libc:

     #[link(name = "c")] extern "C" { fn geteuid() -> u32; fn getegid() -> u32; }

    如果您特別使用 GNU/Linux,則根本不需要鏈接到 libc,因為系統調用符號會通過 VDSO 自動提供給您的程序。 換句話說,您可以使用沒有link屬性的普通extern塊。

  2. 讀取/proc/self/status (可能僅適用於 Linux?)。 該文件包含一行以Uid:開頭的行。 此行列出了真實用戶 ID、有效用戶 ID 以及您可能會發現的其他相關信息。 有關更多信息,請參閱man proc

  3. 如果您使用的是普通的 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系統調用(與打開文件並讀取/解析其內容相反)。

  4. 如果您沒有使用普通的 GNU/Linux 系統,您可能會成功地創建一個新的虛擬文件並通過Metadata正常獲取所有者 ID。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM