2010-06-12 04:06:50 +0000 2010-06-12 04:06:50 +0000
86
86

如何让新文件权限继承父目录?

我有一个叫data的目录。然后我在用户id为'robot'的情况下运行一个脚本。robot会写入data目录并更新里面的文件。我的想法是data是开放的,我和robot都可以更新。

所以我设置了这样的权限和所有者组

drwxrwxr-x 2 me robot-grp 4096 Jun 11 20:50 data

其中我和robot都属于'robot-grp'。我像改变父目录一样递归地改变权限和所有者组。

我定期使用data上传新文件到rsync目录。不幸的是,上传的新文件并没有像我希望的那样继承父目录的权限。相反,它看起来像这样

-rw-r--r-- 1 me users 6 Jun 11 20:50 new-file.txt

当机器人试图更新new-file.txt时,由于缺乏文件权限而失败。

我不知道设置umask是否有帮助。无论如何,新文件并没有真正跟随它。

$ umask -S
u=rwx,g=rx,o=rx

我经常被Unix文件权限所困扰。我有一个正确的计划吗?我使用的是 Debian lenny。

答案 (4)

53
53
53
2010-06-13 02:10:58 +0000

你不希望改变系统的默认umask,那是一种安全风险。粘性位选项在一定程度上会起作用,但使用ACL是最好的方式。这比你想象的要简单。基本ACL的问题在于它们默认不是递归的。如果你在一个目录上设置了一个ACL,那么只有该目录内的文件才会继承ACL。如果你创建了一个子目录,它不会得到父ACL,除非ACL被设置为递归。

首先,确保目录所在的卷启用了ACL。如果你有tune2fs,你可以执行以下操作。

# tune2fs -l /dev/sda1 | grep acl
Default mount options: user_xattr acl

如果你没有tune2fs,那么检查fstabs

# cat /etc/fstab 
/dev/system/root / ext3 defaults 1 1
/dev/system/home /home ext3 defaults 1 2
/dev/storage/data /data ext3 defaults 1 2
LABEL=/boot /boot ext3 defaults 1 2

第四列写着 “defaults "意味着在我的系统中(CentOS 5.5),ACL是开启的。当有疑问时,就把它设为默认值。如果你尝试设置ACL,但出错了,请回到/etc/fstab中,在defaults后面添加acl选项。defaults,acl.

根据我的理解,你希望用户组中的每个人都能对数据目录有写权限。这可以通过以下方式来实现。

setfacl -Rm g:users:rwX,d:g:users:rwX data/
32
32
32
2010-06-12 04:13:24 +0000

标记一个目录setgid(g+s)会使新文件继承该目录的组所有权,但rsync的-g选项会试图覆盖这一点。

4
4
4
2015-09-03 15:36:56 +0000

其他答案适用于一般情况,但由于你提到rsync是问题的来源,你可能只需要调整它的调用。

首先,流行的-a标志会使rsync复制权限;使用-r代替-a,或者添加-no-p(用于无权限同步)和-no-g(用于无组同步)。同时rsync也支持--chmod标志来改变新创建文件的权限。

3
3
3
2010-06-12 04:43:45 +0000

你的掩码不符合你想要的权限。你想要的掩码是002。你目前的掩码是022。另外,关于让目录设置gid的评论是正确的,但我不确定文件组所有权是否是你想要改变的东西。

Unix文件权限其实是一个很简单的模型。我自己也觉得ACL完全搞不懂 :-)