我有一个名为 的目录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
) 将使新文件继承该目录的组所有权,但-g
rsync 的选项将尝试覆盖此设置。
答案3
其他答案适用于一般情况,但正如您提到 rsync 是问题的根源,您可能只需要调整其调用。
首先,常用的-a
标志使 rsync 具有复制权限;使用-r
istead-a
或添加-no-p
(表示无权限同步)和-no-g
(表示无组同步)。rsync 还支持--chmod
更改新建文件权限的标志。
答案4
您的 umask 与所需权限不符。您需要 umask 002。您当前的 umask 为 022。此外,关于使目录 setgid 的注释是正确的,但我不确定您是否要更改文件组所有权。
Unix 文件权限实际上是一个非常简单的模型。我发现 ACL 完全让我困惑。:-)