1

我正在编写一个程序来模仿 cp 实用程序。但是,我无法使文件权限正常工作。我知道它们存储在结构中stat并存储在st_mode带有stat.

我的问题是我没有获得组或其他类别的写权限,即-rwxr-xr-x即使源文件是-rwxrwxrwx. 我设置权限的语句如下。

if ( (dest_fd = open(dest_file, O_WRONLY|O_CREAT, (stats.st_mode & S_IRUSR)|(stats.st_mode & S_IWUSR)|(stats.st_mode & S_IXUSR)|(stats.st_mode & S_IRGRP)|(stats.st_mode & S_IWGRP)|(stats.st_mode & S_IXGRP)|(stats.st_mode & S_IROTH)|(stats.st_mode & S_IWOTH)| (stats.st_mode & S_IXOTH))) < 0)
    {
            printf("There was a problem opening the destination file.");
            exit(EXIT_FAILURE);
    }//ends the if statement opening the destination file.
4

4 回答 4

4

到目前为止的答案是正确的umask,而不是清除umask(如果您的程序是多线程的或者如果您可能正在调用任何创建文件的库函数,这很危险)我会将umask您视为用户配置变量不允许修改,而是fchmod在创建文件后调用文件以赋予它们您想要的最终权限。无论如何,这对于授予某些权限(如 suid/sgid)可能是必要的,某些内核在文件被修改时会删除这些权限。我最初也会使用 mode 创建文件0600,以便在打开它和更改权限之间没有竞争条件,在此期间另一个用户可以获得文件的打开句柄。

于 2012-09-12T15:17:00.117 回答
3

问题的原因是

创建文件的权限为(mode & ~umask)

通常,umaskis 022,因此禁止创建全局可写文件。

于 2012-09-12T15:13:03.503 回答
1

*nix 会屏蔽您创建的文件中的模式位,但您可以使用该umask()函数更改掩码。man umask(也许man 2 umask)了解详情。

于 2012-09-12T15:13:06.717 回答
1

您可以使用chmod(2)系统调用来更改现有文件或目录的权限,或者fchmod(2)在给定打开文件描述符的情况下设置权限。

为了更加安全并防止利用可能的竞争条件,您可以在创建文件时使用一组非常严格的权限,然后使用它chmod(2)来恢复原始权限。这是做什么cp -a(除了它创建具有默认权限的文件):

$ strace cp -a file file1
...
open("file1", O_WRONLY|O_TRUNC)       = 4
...
fchmod(4, 0100640)                    = 0
...

chmod(2)并且fchmod(2)不受 umask 值的影响。

于 2012-09-12T15:23:43.443 回答