【发布时间】: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