在Linux中的目录下为新创建的文件和子目录设置默认权限?


99

我有一堆长时间运行的脚本和应用程序,它们将输出结果存储在几个用户之间共享的目录中。我想要一种方法来确保在此共享目录下创建的每个文件和目录都自动具有u=rwxg=rwxo=r权限。

我知道我可以umask 006在各种脚本的开头使用,但是我不喜欢这种方法,因为许多用户编写自己的脚本,可能会忘记自己设置umask。

我真的只希望文件系统在某个文件夹中时,以一定的权限设置新创建的文件和目录。这是可能吗?

更新:我认为可以使用POSIX ACL(使用默认ACL功能)来完成此操作,但此刻我有点头疼。如果有人可以解释如何使用默认ACL,则可能会很好地回答此问题。


1
POSIX ACL很不错,但是您遇到的机器中有60%不会针对某些文件系统打开它们,具体取决于发行版。这是一个很好的介绍和示例:suse.de/~agruen/acl/linux-acls/online
Tim Post

1
您的意思是我链接的同一文档:)我尚未进行任何更改以阅读它,但感谢您对可用性问题的注意。
David Dean

1
蒂姆·波斯特(Tim Post)评论中的链接似乎已失效,但是由于有了Internet Archive,我可以查看它,并验证vanemery.com/Linux/ACL/POSIX_ACL_on_Linux.html包含完全相同的文档。我将编辑问题以更新链接。
rmunn

Answers:


78

要获得正确的所有权,可以使用以下命令在目录中设置组setuid位:

chmod g+rwxs dirname

这样可以确保在目录中创建的文件归该组所有。然后,您应该确保每个人都使用umask 002或007或类似的特性运行-这就是为什么Debian和许多其他Linux系统默认配置有按用户组。

如果用户的umask太强,我不知道一种强制您想要的权限的方法。


23
这实际上并没有提供解决方案-他询问的是权限而不是所有权,而唯一的方法就是使用ACL
Yarin 2012年

3
“ ...确保每个人都使用umask 002或007或类似性质的东西运行”-这有点麻烦....您如何使Postfix,Dovecot,Clam和Spam Assassin都做到这一点?
jww 2014年

2
+s零件做什么?谢谢。
tommy.carstensen

1
在这种情况下,它意味着设置组ID。也就是说,我们使用g + s来设置SGID位。我之所以说“在这种情况下”,是因为+ s与g组合成组。+ s也可用于设置SUID位(setuid)。
堡垒

57

至少在Linux下,使用默认ACL进行操作的方法如下。

首先,您可能需要在文件系统上启用ACL支持。如果您正在使用ext4,则它已被启用。需要使用该acl选项挂载其他文件系统(例如ext3)。在这种情况下,请将选项添加到中/etc/fstab。例如,如果目录位于您的根文件系统上:

/dev/mapper/qz-root   /    ext3    errors=remount-ro,acl   0  1

然后重新安装:

mount -oremount /

现在,使用以下命令来设置默认ACL:

setfacl -dm u::rwx,g::rwx,o::r /shared/directory

/shared/directory现在,其中的所有新文件都将获得所需的权限。当然,这也取决于创建文件的应用程序。例如,就像使用umask一样,大多数文件从一开始就不会被任何人执行(取决于open(2)或creat(2)调用的mode参数)。一些公用事业喜欢cptarrsync会尽量保留源文件(S),这将屏蔽掉默认的ACL如果源文件不是组可写的权限。

希望这可以帮助!


看来这仍然需要适合umask所有用户。= / unix.stackexchange.com/questions/71743/...
阿纳托techtonik

1
@techtonik如我所写,它取决于创建文件的应用程序。例如,如果使用cp,它将尝试复制源文件的权限。umask使用时甚至没有帮助cp。我也遇到过同样的问题tar。看到这个问题
pelle

@techtonik我现在在回答中添加了与此相关的句子。
pelle

1
是的,当我的ACL和POSIX权限设置全部用于664时,问题似乎出在应用程序中,将权限强制设置为644。为人们排查该问题提供了此后备机制很高兴。许多人甚至都不知道umask
anatoly techtonik 2014年

我的意思是我浪费了一些时间试图查看是否没有正确设置安装标志(在ext4上无法设置它们,因为它们似乎可以自动工作)。没有信息如何检查setfacl works correctly-我以为它应该失败,但是我不确定,因为答案没有提到这一点。
anatoly techtonik

4

这很丑陋,但是您可以使用setfacl命令来实现所需的功能。

在Solaris计算机上,我有一个文件,其中包含用户和组的ACL。不幸的是,您必须列出所有用户(至少我找不到其他方法使之工作):

user::rwx
user:user_a:rwx
user:user_b:rwx
...
group::rwx
mask:rwx
other:r-x
default:user:user_a:rwx
default:user:user_b:rwx
....
default:group::rwx
default:user::rwx
default:mask:rwx
default:other:r-x

将文件命名为acl.lst并填写您的真实用户名,而不是user_X。

现在,您可以通过发出以下命令在目录中设置这些ACL:

setfacl -f acl.lst /your/dir/here

如果他们都是同一个组的成员,而只使用组权限,您可以离开用户列表吗?
David Dean

我问自己同样的问题。自从我设置这个以来已经有一段时间了。但是,每当我有一个新用户(与其他用户在同一组中)时,我都会忘记更新列表,并且会抱怨新用户无法写入/删除文件。因此答案是:不,你不能。
innaM

4

在您的Shell脚本(或中.bashrc)中,您可以使用类似以下内容的东西:

umask 022

umask 是用于确定掩码设置的命令,该掩码控制如何为新创建的文件设置文件权限。


1
这是不正确的,因为umask限制了它不能添加权限的权限
ACV

@ACV您能详细说明吗?这对我有用,新创建的文件现在允许组成员umask 002在.bashrc中执行操作时具有rw权限。
亚瑟·登特

3
@ArthurDent umask 002限制了对其他人的访问,使组保持不变。记住,这是ugo-其他用户组。还请记住,umask基本上意味着从默认值中减去。对于文件:666 - 002表示664,表示组不受影响。
ACV
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.