确定当前用户的文件权限
我正在寻找一种方法来确定 POSIX 兼容系统上当前用户(即进程的 UID)的文件权限。我不想尝试打开该文件 - 这可能会弄乱目录和各种特殊文件。
我正在编译指定目录的目录列表,对于每个文件,报告一堆信息:文件名、大小、类型(文件/目录/其他)、权限(可以读取、可以写入)。对于大小和类型,我已经有了 stat 调用的结果。
这就是我想到的:
if ((dirent->st_uid == getuid() && dirent->st_mode & S_IRUSR)
|| (dirent->st_gid == getgid() && dirent->st_mode & S_IRGRP)
|| (dirent->st_mode && S_IROTH)) entry->perm |= PERM_READ;
if ((dirent->st_uid == getuid() && dirent->st_mode & S_IWUSR)
|| (dirent->st_gid == getgid() && dirent->st_mode & S_IWGRP)
|| (dirent->st_mode && S_IWOTH)) entry->perm |= PERM_WRITE;
我是否必须这样做,或者是否有一个简单的调用/宏可以完成同样的事情? ACL 支持的奖励积分,尽管目前这并不是绝对必要的。
I am looking for a way to determine file permissions for the current user (i.e. the process's UID) on POSIX-compliant systems. I don't want to try opening the file - that could get messy with directories and all kinds of special files.
I am compiling a directory listing of a specified directory, and for each file, reporting a bunch of things: filename, size, type (file/directory/other), permissions (you can read, you can write). For size and type, i already have results of stat
call available.
Here's what i came up with:
if ((dirent->st_uid == getuid() && dirent->st_mode & S_IRUSR)
|| (dirent->st_gid == getgid() && dirent->st_mode & S_IRGRP)
|| (dirent->st_mode && S_IROTH)) entry->perm |= PERM_READ;
if ((dirent->st_uid == getuid() && dirent->st_mode & S_IWUSR)
|| (dirent->st_gid == getgid() && dirent->st_mode & S_IWGRP)
|| (dirent->st_mode && S_IWOTH)) entry->perm |= PERM_WRITE;
Do i have to do this way, or is there a simple call/macro that would accomplish the same thing? Bonus points for ACL support, although that is not strictly necessary at this point.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
access(2)
将在内核中为您执行全套权限测试:一些示例输出:
编辑
请注意
access(2)
容易受到 TOCTTOU Time-of 的影响-检查使用时间竞争条件。您不应使用access(2)
授予或拒绝特权进程中的用户对文件的访问权限,您的程序将容易受到可能被利用的竞争条件的影响。如果这就是您想要测试的目的,请在执行任何open(2)
或exec*()
调用之前使用setfsuid(2)
。access(2)
will perform the full suite of permissions tests for you, in the kernel:Some sample output:
EDIT
Note that
access(2)
is vulnerable to a TOCTTOU Time-of-check-to-time-of-use race condition. You shouldn't useaccess(2)
to grant or deny access to files to a user from a privileged process, your program would be vulnerable to a race condition that could be exploited. If this is what you want the test for, usesetfsuid(2)
before doing anyopen(2)
orexec*()
calls.使用
access()
检查权限。Use
access()
to check for permissions.