这是我的问题。我需要从FreeBSD上的C代码中检查特定文件和特定用户的读取权限。我写了一段代码:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main(int argc, char *argv[]){
int r_ok;
if(setuid(1002)){
printf("Cant's set uid\n");
exit(1);
}
r_ok = access("/tmp/dir", R_OK);
printf("error: %d: %s\n", errno, strerror(errno));
printf("%d\n", r_ok);
return 0;
}
一般情况下它工作正常,但是当我为/ tmp / dir设置权限时:
d---r-x--- 2 root fruit1 512 Sep 10 18:20 /tmp/dir
程序输出
error: 13: Permission denied
-1
使用UID 1002的用户是group1的有效成员:
# groups 1002
orange fruit1
我会很乐意为你提供帮助。
答案 0 :(得分:1)
setuid()
设置进程的真实有效用户ID,但不修改组访问列表,因为您必须调用setgid()
,{{1 }或initgroups()
。
因此,您的程序将使用已使用的ID 1002以及原始组ID和组运行 访问列表,而不是用户1002的组访问列表。 这就解释了为什么该进程没有对目录的读取权限。
请注意,setgroups()
被视为“安全漏洞”,(例如参见access() Security Hole)。
通常最好只是尝试打开文件或目录而不是检查
事先读取权限。