C语言和linux文件权限问题
本帖最后由 dt3tc 于 2019-11-30 12:06 编辑已经 用chmod 设置了000权限位,文件属主root,但是 以普通用户 调用C语言stat()函数 仍然能 获取 该文件各属性,没有报EACCES错误
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <time.h>
int main() {
struct stat buf;
char *filename="./test";
if(stat(filename, &buf)==-1){
switch(errno){
case ENOENT:
printf("file isn't exist.");
break;
case ENOTDIR:
printf("the directory contain the file isn't directory.");
break;
case ELOOP:
printf("too much symbol link.");
break;
case EFAULT:
printf("the memory space pointed is invalid.");
break;
case EACCES:
printf("access is refused.");
break;
case ENOMEM:
printf("core memory not enough.");
break;
case ENAMETOOLONG:
printf("filename too long.");
break;
default:
printf("other error.");
};
putchar('\n');
}
struct tm* c = localtime(&buf.st_atime); //struct stat* file_message
printf("last access time is %2d月 %2d %02d:%02d\n", c->tm_mon+1, c->tm_mday, c->tm_hour, c->tm_min);
printf("last access time is %s\n", asctime(c));
return 0;
}
谢谢
https://i.loli.net/2019/11/30/4MSGPFOaWLHiDoV.jpg 本帖最后由 jackz007 于 2019-11-30 14:30 编辑
dt3tc 发表于 2019-11-30 14:01
这个办法,除了 用echo命令写入会失败,其他跟前面结果基本一样的。。
不可能吧,比如,假设文件路径是 "/home/userx/abc/file.dat" 那么,子目录 "/home/userx/abc" 的属主应该是 root,权限应该是 0733,文件 "/home/userx/abc/file.dat" 的属主应该是 root,权限应该是 0755。用普通用户身份,在 "/home/userx/abc/" 路径以外运行你写的程序。再试试?
因为在 linux 文件体系中,fopen()、fread()、fwite() 等函数读写的是文件内容,这些东西直接受文件属主和权限的控制,stat() 访问文件实际上读取的是子目录的内容,自然受到子目录的属主及权限的控制。 截图看一下 人造人 发表于 2019-11-30 11:34
截图看一下
图片外链已经写到1L最后那里了 本帖最后由 jackz007 于 2019-11-30 12:29 编辑
修改文件本身的权限并不能达到楼主的目的,不信用 ls -l 命令看看,是不是可以看到这个文件的大小、日期、权限等属性,既然操作系统能,那你也应该能,stat() 自然可以正常取到文件的信息。
000 的权限所阻止的应该是普通用户对这个文件内容的读、写、执行操作。如果想拒绝 stat() 对这个文件的访问,要修改的应该是这个文件所在的子目录,比如,以 root 用户身份,把目标文件的权限改成正常值 755,把目标文件所在子目录的权限改成 733,然后,切换成普通用户,用 stat() 函数访问目标文件试试看。 jackz007 发表于 2019-11-30 12:25
修改文件本身的权限并不能达到楼主的目的,不信用 ls -l 命令看看,是不是可以看到这个文件的大小、 ...
我是想知道 怎么 才能让 stat() 函数 报EACCES 错误。 000 的权限所阻止的应该是普通用户对这个文件内容的读、写、执行操作。如果想拒绝 stat() 对这个文件的访问,要修改的应该是这个文件所在的子目录,比如,以 root 用户身份,把目标文件的权限改成正常值 755,把目标文件所在子目录的权限改成 733,然后,切换成普通用户,用 stat() 函数访问目标文件试试看。 jackz007 发表于 2019-11-30 12:30
000 的权限所阻止的应该是普通用户对这个文件内容的读、写、执行操作。如果想拒绝 stat() 对这个文件 ...
这个办法,除了 用echo命令写入会失败,其他跟前面结果基本一样的。。
页:
[1]