【问题标题】:Linux: check if process has read access to file in C/C++Linux:检查进程是否对 C/C++ 中的文件具有读取权限
【发布时间】:2013-02-13 21:10:16
【问题描述】:

假设我们有一些 PID 和绝对文件路径 [不是符号链接,只是一个常规文件] - 确定 PID 对该文件具有读取权限的最有效方法是什么?

【问题讨论】:

  • @Eddy_Em 这是man 2 stat ;-)
  • @NikosC.,真的,谢谢。 man 2 statman 3 stat 更详细。
  • 欢迎来到 StackOverflow。您是否真的要求最有效的方法,或者任何有效的方法都可以?而且,如果效率是您的目标,您使用什么衡量效率的方法?

标签: c++ c linux pid


【解决方案1】:

我只知道一种方法可以做到这一点。首先,通过构造路径/proc/+PID,找到进程的UID和GID。例如/proc/4261。然后您 stat() 该路径并获取其 UID 和 GID。然后,你stat()你要检查读取权限的文件,并检查进程的UID/GID是否有读取权限:

(假设您已经在path_to_proc中构建了“/proc/[PID]”路径。)

struct stat buf;

// Get UID and GID of the process.
stat(path_to_proc, &buf);
uid_t proc_uid = buf.st_uid;
gid_t proc_gid = buf.st_gid;

// Get UID and GID of the file.
stat(path_to_file_you_want_to_check, &buf);

// If the process owns the file, check if it has read access.
if (proc_uid == buf.st_uid && buf.st_mode & S_IRUSR) {
    // Yes, the process has read access.
}

// Check if the group of the process's UID matches the file's group
// and if so, check for read/write access.
else if (proc_gid == buf.st_gid && buf.st_mode & S_IRGRP) {
    // Yes, the process has read access.
}

// The process's UID is neither the owner of the file nor does its GID
// match the file's.  Check whether the file is world readable.
else if (buf.st_mode & S_IROTH) {
    // Yes, the process has read access.
}

请注意,代码并不完美。它不处理进程的用户实际上属于文件组而不是用户的主要组的可能性。为了解决这个问题,您需要使用 getgrouplist() (这意味着您需要先将进程 UID 转换为包含实际用户名的字符串,然后将所有返回的组与文件的组进行比较,如果匹配,检查组读取访问权限 (S_IRGRP)。)

【讨论】:

  • 问题的措辞让我相信它想要检查具有给定 PID 的 不同 进程的访问权限。
  • @Angew 是的,我注意到它为时已晚。我完全修改了答案。
【解决方案2】:

打开文件。这真的是唯一知道的方法。涉及stat(2) 的答案要求您编写代码来解释权限位并将它们与您的活动 uid/gid 和补充组进行比较。而且无论如何它在一般情况下是不完整的:像 selinux 或 apparmor 这样的 LSM 钩子也可以对传统 Unix 权限模型无法捕获的文件实现权限模型。

【讨论】:

  • 你说的完全正确。 “stat()”很好。一个漂亮、简单的“open()”——并检查错误状态——可以说更好。
  • OP 想要检查一些外部进程的访问权限。不是当前进程。
  • 那么任务是不可能的,需求格式不正确,抱歉。我已经介绍了 LSM 钩子。但是,如果任务位于您的进程看不到的 chroot 中怎么办?该文件可能非常可读,但您无法对其进行检查。同样的命名空间容器。或者该文件可能位于 FUSE 文件系统(例如 sshfs)上,其中 real 权限是远程的,并且无法从本地环境获知。它只是行不通。
猜你喜欢
  • 2015-02-17
  • 2011-04-20
  • 2015-05-28
  • 1970-01-01
  • 2011-06-06
  • 2014-03-27
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多