我的问题类似于如何设置 Linux 中所有新建文件的默认文件权限- 但在重要方面有所不同:
我希望在某个目录中创建(或复制或移动到)的所有文件都继承一组不同于系统默认的默认权限。
原理:所讨论的目录是应用程序的“入口漏斗”。组中的用户将文件放在目录中,应用程序(在同一组中的另一个用户 ID 下运行)获取并处理它们。问题是,目录中放置的每个文件的所有者都是将其放置在那里的用户,权限默认为“rw-r--r--”;我想将其更改为“rw-rw----”。执行接收的应用程序无法明确执行此操作,因为应用程序运行的用户 ID 不拥有所讨论的文件,并且默认权限不允许应用程序对文件进行 chmod 操作!显然,用户可以在将文件放入那里后执行 chmod - 但我希望让用户的“放下”尽可能简单。(这些人不懂 Linux,他们只是将文件从他们的 Windows 桌面拖放到(Samba)网络共享 - 即他们甚至不知道他们正在与 Linux 系统交互。)
umask 似乎太强大了:我不想为这些用户在任何地方创建的每个文件设置默认权限 - 只为在这个目录中创建(或放置)的文件设置默认权限。
请指教...谢谢!
答案1
您可以使用 ACL(访问控制列表)设置目录中文件的默认权限。
如果默认 ACL 与目录相关联,则创建文件对象的函数的模式参数和目录的默认 ACL 用于确定新对象的 ACL:
新对象继承包含目录的默认 ACL 作为其访问 ACL。
修改与文件权限位相对应的访问 ACL 条目,使得它们不包含模式参数指定的权限中未包含的权限。
要进行设置(相应地更改设备、目录等):
编辑您的/etc/fstab
文件并添加acl
挂载选项。
/dev/mapper/star-home /home ext3 defaults,acl 0 2
重新挂载(Sambamount.cifs
手册页)通过重新启动来恢复文件系统,或者使用:
mount -o remount,acl /home
设置目录的默认 ACL(您可能还需要设置现有文件的 ACL):
$ setfacl -m d:user:george:rwx,d:group:sales-g:rwx,d:group:marketing-g:rwx projections
请参阅链接的教程以了解更多信息。
答案2
我可以提供一个解决方法:创建一个单独的“drop”目录,在那里运行一个单独的迷你作业来修复权限,然后将文件移动到应用程序的数据目录中。您可以使用 incron 来实现这一点,这样几乎不会出现明显的时间延迟。
答案3
我能想到四种可能的方法:
- umask,您不想使用
- 程序包装器,它设置应用程序的 umask,而不是用户的
- cron,正如@Peter Eisentraut 所描述的;
find $HOME/intake -type f -exec chmod 660 {} \;
,不同的系统对此有性能改进(例如选项-exec+
) - 基于目录的设置,这需要一点 shell 编程才能完成,但基本上,shell 在设置提示符或调用 cd 时,如果该目录中存在点文件(或可能是祖先目录),则会更改 umask;对于 bash 来说,这
PROMPT_COMMAND='test -s $PWD/.umask && umask $(cat $PWD/.umask)'";$PROMPT_COMMAND"
是最简单的。