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


85

我有一个名为的目录data。然后,我在用户ID“机器人”下运行脚本。机械手将写入data目录并更新其中的文件。这个想法data对我和机器人都是开放的。

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

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

我和机器人都属于“ 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。

Answers:


53

您不想更改系统的默认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

第4列显示“默认值”表示在我的系统(CentOS 5.5)上,ACL处于打开状态。如有疑问,请将其保留为默认值。如果尝试设置ACL并出错,请返回并在默认值之后立即将acl选项添加到/ etc / fstab中 defaults,acl

据我了解,您希望用户组中的每个人都对数据目录具有写权限。这可以通过以下方式完成:

setfacl -Rm g:users:rwX,d:g:users:rwX data/

我使用了此命令,但不能解决问题,请问如何撤消该命令?
Itai Ganot

用做了ubuntu上的把戏sudo setfacl -Rm g:users:rwX,d:g:users:rwX /var/www/logs_or_something。PHPUnit测试出现问题。从运行测试创建日志文件后,apache用户www-data无法写入/读取它们。
s3m3n 2013年

2
@Itai Ganot-根据setfacl手册页-b--remove-all删除扩展的ACL。
jww 2014年

因此,您只需setfacl -Rm g:users:rwX,d:g:users:rwX data//etc/fstab?的末尾附加
425nesp 2014年

@piña号 您对/ etc / fstab所做的唯一更改是更改defaultsdefaults,aclsetfacl是您应该从终端运行的命令。 data/应该用您要更改的目录的路径替换。
Segfault 2014年

32

标记目录setgid(g+s)将使新文件继承该目录的组所有权,但是-grsync 的选项将尝试覆盖此文件。


11
setgid位仅使创建的文件继承组/ if /,创建新文件的人是该组的成员;如果创建用户是所有者而不是组的成员,或者目录是可写的,则setgid不会执行任何操作。并且仍需要将所有创建文件用户的umask设置为允许适当的组访问。
dannysauer 2013年

1
@dannysauer“如果创建用户是所有者,但不是组的成员,则setgid位将不会执行任何操作”-谢谢。现在说得通-但没有rsync的反馈,想知道为什么它不起作用。
user12345

4

其他答案通常适用于一般情况,但是正如您提到rsync是问题的根源,您可能只需要调整其调用即可。

首先,popular -a标志赋予rsync复制权限;使用-ristead代替-a或添加-no-p(不许可同步)和-no-g(不许可组同步)。rsync还支持--chmod标志以更改对新创建文件的权限。


3

您的umask对所需的权限是错误的。您想要的umask为002。您当前的umask为022。此外,有关创建目录setgid的注释是正确的,但是我不确定文件组所有权是否要更改。

Unix文件权限实际上是一个非常简单的模型。我发现ACL完全使我感到困惑。:-)


4
“ Unix文件权限实际上是一个非常简单的模型。我发现ACL完全使我感到困惑。” -我有点相反的感觉(但还是+1)。ACL(和Allow / Deny ACE)很简单,Unix权限没有意义。但这来自一个遭受Postfix / Dovecot / Clam / SpamAssassin安装的家伙。
jww 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.