鱼C论坛

 找回密码
 立即注册
查看: 1706|回复: 7

[已解决]C语言和linux文件权限问题

[复制链接]
发表于 2019-11-30 09:20:25 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 dt3tc 于 2019-11-30 12:06 编辑

已经 用chmod 设置了000权限位,文件属主root,但是 以普通用户 调用C语言stat()函数 仍然能 获取 该文件各属性,没有报EACCES错误

  1. #include <sys/stat.h>
  2. #include <unistd.h>
  3. #include <stdio.h>
  4. #include <errno.h>
  5. #include <time.h>

  6. int main() {
  7.     struct stat buf;
  8.     char *filename="./test";
  9.     if(stat(filename, &buf)==-1){
  10.         switch(errno){
  11.             case ENOENT:
  12.              printf("file isn't exist.");
  13.              break;
  14.             case ENOTDIR:
  15.              printf("the directory contain the file isn't directory.");
  16.              break;
  17.             case ELOOP:
  18.              printf("too much symbol link.");
  19.              break;
  20.             case EFAULT:
  21.              printf("the memory space pointed is invalid.");
  22.              break;
  23.             case EACCES:
  24.              printf("access is refused.");
  25.              break;
  26.             case ENOMEM:
  27.              printf("core memory not enough.");
  28.              break;
  29.             case ENAMETOOLONG:
  30.              printf("filename too long.");
  31.              break;
  32.             default:
  33.              printf("other error.");

  34.         };
  35.         putchar('\n');
  36.    
  37.     }
  38.   
  39.     struct tm* c = localtime(&buf.st_atime);                //struct stat* file_message
  40.     printf("last access time is %2d月 %2d %02d:%02d\n", c->tm_mon+1, c->tm_mday, c->tm_hour, c->tm_min);
  41.     printf("last access time is %s\n", asctime(c));

  42.    
  43.     return 0;
  44. }

复制代码

谢谢
https://i.loli.net/2019/11/30/4MSGPFOaWLHiDoV.jpg
最佳答案
2019-11-30 09:20:26
本帖最后由 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() 访问文件实际上读取的是子目录的内容,自然受到子目录的属主及权限的控制。

最佳答案

查看完整内容

不可能吧,比如,假设文件路径是 "/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( ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-30 09:20:26 | 显示全部楼层    本楼为最佳答案   
本帖最后由 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() 访问文件实际上读取的是子目录的内容,自然受到子目录的属主及权限的控制。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-30 11:34:39 | 显示全部楼层
截图看一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-30 12:07:20 | 显示全部楼层

图片外链已经写到1L最后那里了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-30 12:25:04 | 显示全部楼层
本帖最后由 jackz007 于 2019-11-30 12:29 编辑

      修改文件本身的权限并不能达到楼主的目的,不信用 ls -l 命令看看,是不是可以看到这个文件的大小、日期、权限等属性,既然操作系统能,那你也应该能,stat() 自然可以正常取到文件的信息。
      000 的权限所阻止的应该是普通用户对这个文件内容的读、写、执行操作。如果想拒绝 stat() 对这个文件的访问,要修改的应该是这个文件所在的子目录,比如,以 root 用户身份,把目标文件的权限改成正常值 755,把目标文件所在子目录的权限改成 733,然后,切换成普通用户,用 stat() 函数访问目标文件试试看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-30 12:27:08 | 显示全部楼层
jackz007 发表于 2019-11-30 12:25
修改文件本身的权限并不能达到楼主的目的,不信用 ls -l 命令看看,是不是可以看到这个文件的大小、 ...


我是想知道 怎么 才能让 stat() 函数 报EACCES 错误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-30 12:30:47 | 显示全部楼层
      000 的权限所阻止的应该是普通用户对这个文件内容的读、写、执行操作。如果想拒绝 stat() 对这个文件的访问,要修改的应该是这个文件所在的子目录,比如,以 root 用户身份,把目标文件的权限改成正常值 755,把目标文件所在子目录的权限改成 733,然后,切换成普通用户,用 stat() 函数访问目标文件试试看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-30 14:01:25 | 显示全部楼层
jackz007 发表于 2019-11-30 12:30
000 的权限所阻止的应该是普通用户对这个文件内容的读、写、执行操作。如果想拒绝 stat() 对这个文件 ...

这个办法,除了 用echo命令写入会失败,其他跟前面结果基本一样的。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-12 07:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表