Unix中的文件权限问题

时间:2012-09-12 15:08:30

标签: c unix file-io permissions

我正在编写一个程序来模仿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 个答案:

答案 0 :(得分:3)

问题的原因是

  

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

通常,umask022,因此禁止创建世界可写文件。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

* nix会屏蔽您创建的文件中的模式位,但您可以使用umask()功能更改屏蔽。 man umask(或许man 2 umask)了解详情。

答案 3 :(得分: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值的影响。