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

Wai*_*ung 87 linux unix shell permissions

我有一个名为data. 然后我在用户 id 'robot' 下运行一个脚本。机器人写入data目录并更新里面的文件。data我和机器人都可以更新这个想法。

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

drwxrwxr-x  2 me robot-grp 4096 Jun 11 20:50 data
Run Code Online (Sandbox Code Playgroud)

我和机器人都属于'robot-grp'。我像父目录一样递归地更改权限和所有者组。

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

-rw-r--r-- 1 me users       6 Jun 11 20:50 new-file.txt
Run Code Online (Sandbox Code Playgroud)

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

我不确定设置 umask 是否有帮助。无论如何,新文件并没有真正遵循它。

$ umask -S
u=rwx,g=rx,o=rx
Run Code Online (Sandbox Code Playgroud)

我经常对 Unix 文件权限感到困惑。我什至有一个正确的计划吗?我正在使用 Debian lenny。

chu*_*rnd 54

您不想更改系统的默认 umask,这是一个安全风险。粘滞位选项在某种程度上会起作用,但使用 ACL 是最好的方法。这比你想象的要容易。基本 ACL 的问题在于默认情况下它们不是递归的。如果在目录上设置 ACL,则只有该目录中的文件会继承 ACL。如果创建子目录,它不会获取父 ACL,除非 ACL 设置为递归。

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

# tune2fs -l /dev/sda1 | grep acl
Default mount options:    user_xattr acl
Run Code Online (Sandbox Code Playgroud)

如果没有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
Run Code Online (Sandbox Code Playgroud)

显示“默认值”的第 4 列表示在我的系统 (CentOS 5.5) 上,ACL 已启用。如有疑问,请将其保留为默认值。如果您尝试设置ACL,它的错误了,回去设置后,添加ACL选项/ etc / fstab中正确的: defaults,acl

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

setfacl -Rm g:users:rwX,d:g:users:rwX data/
Run Code Online (Sandbox Code Playgroud)

  • @Itai Ganot - 根据 [`setfacl` 手册页](http://linux.die.net/man/1/setfacl),`-b` 或 `--remove-all` 删除了扩展的 ACL。 (2认同)

Ign*_*ams 33

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

  • setgid 位只会使创建的文件继承组 /if/ 创建新文件的人是该组的成员;如果创建用户是所有者但不是组的成员,或者目录是全局可写的,则 setgid 位不会做任何事情。所有文件创建用户的 umask 仍然需要设置为允许适当的组访问。 (12认同)

mbq*_*mbq 5

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

首先,流行的-a标志使 rsync 复制权限;使用-ristead of-a或 add -no-p(用于无权限同步)和-no-g(用于无组同步)。rsync 还支持--chmod标志来更改新创建文件的权限。