我正在编写一个程序来模仿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.
答案 0 :(得分:3)
问题的原因是
创建文件的权限为
(mode & ~umask)
通常,umask
为022
,因此禁止创建世界可写文件。
答案 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值的影响。