gpt4 book ai didi

c - 在 C 中设置新创建文件的所有者

转载 作者:行者123 更新时间:2023-11-30 19:09:58 26 4
gpt4 key购买 nike

我有一个程序 write.c,它创建一个新文件。我通过 root 用户编译了它,并使用 chmod u+s write 为 setuid 设置了粘性位。

现在,如果 user2 执行这个程序。以 root 作为所有者创建了一个新文件,为什么?文件的所有者应该是 user2。为此,我使用 setuid()seteuid() 将 uid 更改为 user2。然后创建文件。但这也会创建以 root 为所有者的文件。我想以 user2 作为所有者创建该文件。

最佳答案

发布mcve 。你所描述的在我的系统上运行得很好。这:

#!/bin/sh -e

cat > main.c <<EOF
#define _GNU_SOURCE
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv)
{

int fd;
uid_t ruid,euid,suid;
struct stat sb;
getresuid(&ruid,&euid,&suid);
printf("ruid=%ld euid=%ld suid=%ld\n", (long)ruid,(long)euid,(long)suid);

if(0>(fd = open(argv[1], O_CREAT|O_RDWR, 0660))){
perror(0);
exit(1);
}
fstat(fd,&sb);
printf("owner=%ld\n", (long)sb.st_uid);

close(fd);
seteuid(ruid);
getresuid(&ruid,&euid,&suid);
printf("ruid=%ld euid=%ld suid=%ld\n", (long)ruid,(long)euid,(long)suid);

if(0>(fd = open(argv[2], O_CREAT|O_RDWR, 0660))){
perror(0);
exit(1);
}
fstat(fd,&sb);
printf("owner=%ld\n", (long)sb.st_uid);

close(fd);
}
EOF

gcc main.c
sudo chown root a.out
sudo chmod u+s a.out
rm -f roots mine
./a.out roots mine

让我明白:

ruid=1008 euid=0 suid=0
owner=0
ruid=1008 euid=1008 suid=0
owner=1008

即,seteuid 调用成功重置了我的 uid 和第二个文件不再是 root 所有者。

关于c - 在 C 中设置新创建文件的所有者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42190509/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com