鱼C论坛

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

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

[复制链接]
发表于 2019-11-30 09:20:25 | 显示全部楼层 |阅读模式
10鱼币
本帖最后由 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
最佳答案
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, 2025-1-16 11:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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