在 Unix 上的 C 中,进程如何在不打开文件的情况下知道它对文件具都有哪些权限?
Posted
技术标签:
【中文标题】在 Unix 上的 C 中,进程如何在不打开文件的情况下知道它对文件具都有哪些权限?【英文标题】:In C on Unix, how can a process tell what permissions it has to a file without opening it?在 Unix 上的 C 中,进程如何在不打开文件的情况下知道它对文件具有哪些权限? 【发布时间】:2010-11-11 10:19:59 【问题描述】:我可以使用 stat() 来确定所有者、组或其他人拥有哪些权限,并且我可以使用 geteuid() 和 getpwuid() 来获取进程的用户名。我不太确定如何在没有系统调用的情况下获取用户所属的组。
即使知道如何获取这些组,整合所有这些信息似乎也需要做很多工作。有没有更简单的方法?
【问题讨论】:
【参考方案1】:access() 检查路径参数指向的文件名。这里的缺点是每个文件权限都必须使用下面的标志单独检查。 R_OK 测试读取权限。 W_OK 测试写权限。 X_OK 测试执行或搜索权限。 F_OK 检查文件是否存在
【讨论】:
【参考方案2】:unistd.h 定义了一个 access() 函数,
int access(const char *path, int amode);
其中 path 是您的文件名,amode 是要检查的访问权限的按位包含 OR。
R_OK、W_OK 和 X_OK 分别保存用于检查读取、写入和搜索/执行权限的模式值。
int readable, readwritable;
//checking for read access
readable = access("/usr/bin/file", R_OK);
//checking for read and write access
readwritable = access("/usr/bin/file", R_OK|W_OK);
您可以在 unix 手册页中找到 access() 的完整描述。
【讨论】:
【参考方案3】:access() POSIX function 无需打开即可查看权限。但是,它需要一个系统调用。
access() 函数应根据 amode 中包含的位模式检查由 path 参数指向的路径名命名的文件的可访问性,使用真实用户 ID 代替有效用户 ID 和真实组 ID代替有效的组 ID。
例如:
access("/etc/passwd",W_OK)
检查您是否具有对 passwd 文件的写入权限。使用 R_OK,检查读取权限。
eaccess()
function(euidaccess
是同义词)使用有效的用户和组 ID。虽然 eaccess 似乎得到了广泛的支持,但据我所知,它不是 POSIX 标准的一部分。
【讨论】:
eaccess 是非标准的,但是 POSIX.1-2008 添加了 faccessat,它可以与标志 AT_EACCESS 一起使用,使用有效 id 执行访问检查。然而,这还没有得到广泛的支持。 opengroup.org/onlinepubs/9699919799/functions/faccessat.html以上是关于在 Unix 上的 C 中,进程如何在不打开文件的情况下知道它对文件具都有哪些权限?的主要内容,如果未能解决你的问题,请参考以下文章