我正在寻找一种方法来确定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支持的加分点,虽然此时并非严格必要。
答案 0 :(得分:8)
access(2)
将在内核中为您执行全套权限测试:
#include <unistd.h>
#include <stdio.h>
int main(int argc, char* argv[]) {
int i;
for (i=0;i<argc;i++) {
if(access(argv[i], R_OK)) {
printf("%s\n", argv[i]);
perror("R_OK");
}
if(access(argv[i], W_OK)) {
printf("%s\n", argv[i]);
perror("W_OK");
}
}
return 0;
}
一些示例输出:
$ ./foo ./foo /etc/passwd /etc/shadow
/etc/passwd
W_OK: Permission denied
/etc/shadow
R_OK: Permission denied
/etc/shadow
W_OK: Permission denied
修改强>
请注意,access(2)
容易受到TOCTTOU使用时间检查时间条件的影响。您不应该使用access(2)
授予或拒绝从特权进程向用户访问文件,您的程序将容易受到可能被利用的竞争条件的攻击。如果这是您要测试的内容,请在执行任何setfsuid(2)
或open(2)
来电之前使用exec*()
。
答案 1 :(得分:3)
使用access()
检查权限。