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

Set owner of the new created file in C

我有一个程序 write.c,它创建一个新文件。我通过 root 用户编译它并使用 chmod u+s write.

设置 setuid 的粘性位

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

Post 一个 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 的所有者。