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

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

我有一个名为 的目录data。然后我在用户 ID“robot”下运行一个脚本。机器人写入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。

答案1

您不想更改系统的默认 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 列显示“defaults”,表示在我的系统 (CentOS 5.5) 上,ACL 已启用。如有疑问,请保留默认设置。如果您尝试设置 ACL 并出错,请返回并在 defaults: 之后将 acl 选项添加到 /etc/fstab 中 defaults,acl

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

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

答案2

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

答案3

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

首先,常用的-a标志使 rsync 具有复制权限;使用-ristead-a或添加-no-p(表示无权限同步)和-no-g(表示无组同步)。rsync 还支持--chmod更改新建文件权限的标志。

答案4

您的 umask 与所需权限不符。您需要 umask 002。您当前的 umask 为 022。此外,关于使目录 setgid 的注释是正确的,但我不确定您是否要更改文件组所有权。

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

相关内容