【问题标题】:Open file with owner's file permissions in c在c中使用所有者的文件权限打开文件
【发布时间】:2014-02-04 18:36:41
【问题描述】:

我需要用 C 语言编写一个程序来打开一个文本文件并打印内容。但是,它需要能够读取和打印只有所有者才能读取的文件,即使其他人运行该程序也是如此。我不知道如何获得所有者的读取权限。

我的问题措辞不佳,让我更具体一些。我需要制作两个程序,一个只是正常读取文本文件,另一个可以读取具有所有者权限的文本文件。

这里是普通的文件读取程序,read_unprivileged.c

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>

int main(int argc, char *argv[])
{   
    FILE *fp;
    char ch;
    char *filename = argv[1];

    fp = fopen(filename, "r"); //lets you read file                              

    if(fp == NULL){
        printf("File is null!");
    }

    while( ( ch = fgetc(fp) ) != EOF ){
        printf("%c",ch);
    }
    fclose(fp);
    return 0;
}

这是应该能够以所有者权限读取文件的文件(除了突出显示的行之外,其他内容相同),read_privileged.c

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>

int main(int argc, char *argv[])
{   
    FILE *fp;
    char ch;
    char *filename = argv[1];

    setreuid(geteuid(), getuid());
    fp = fopen(filename, "r"); //lets you read file                              
    setreuid(geteuid(), getuid());

    if(fp == NULL){
        printf("File is null!");
    }

    while( ( ch = fgetc(fp) ) != EOF ){
        printf("%c",ch);
    }
    fclose(fp);
    return 0;
}

所以有问题的文件只能由所有者(我)读取。

-rwx------ secret.txt

当我(所有者)调用它时,这两个程序都可以读取文件,这是应该的。所以我这样做: chmod 4755 读取特权.c chmod 4755 read_unprivileged.c

当任何一个编译成 a.out 时,a.out 文件都没有 userid 位。

-rwxr-xr-x a.out

当我以另一个用户身份运行已编译的 a.out 时,都没有工作。但是,如果我这样做:

chmod 4755 a.out

它们都有效,我猜这违背了目的(因为 read_unprivileged 有效,它不应该)。我不明白为什么可执行文件会失去权限,以及为什么设置 setreuid(geteuid(), getuid());不起作用。

【问题讨论】:

标签: c file-permissions


【解决方案1】:

在 unix 系统上,生成的可执行文件需要设置 s 位。这可以由 root 用户或拥有文件的用户完成(他还必须拥有可执行文件)。

如果root和文件所有者都没有帮助你,你就没有阅读文件的权利。

假设您的程序文件名为 readit 并且已由文件所有者编译。文件所有者现在必须执行chmod +s readit。这样做后,(由任何用户)启动程序会将有效的用户标识设置为文件所有者的用户标识。

不过要小心。设置了 s 位的程序是入侵尝试的首选目标。

【讨论】:

  • 除非您的系统有错误,否则这是不可能的。
  • *注意:此评论是对我最初的问题(删除部分)的回复。
猜你喜欢
  • 2011-07-26
  • 2011-12-16
  • 1970-01-01
  • 2014-08-11
  • 2011-09-10
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多