如何设置系统范围的umask?

70
我在一家实验室工作,我们使用Linux(Debian和Ubuntu)。用户名和组名通过NIS和yp进行管理。我们有一些共同用户,所有人都可以访问这些用户来运行实验,然后每个人还有自己的用户,另外,我们都是一个共同组的成员。
我该如何使得所有共享的/home/驱动器(NFS)中的文件和目录都能够被用户和组读/写/执行?基本上我想要的是:
chmod -R 664 /home
chgrp -R commongroup /home

或者等价于 umask 0002

但是运行上述命令只能修复文件夹中当前的文件,umask仅适用于单个用户,每次用户登录时都必须运行,即在.bashrc文件中(并且这是否适用于通过gnome更改模式?)。是否有系统范围的命令或设置可供我使用,以确保我们的共同群组对共享文件具有写访问权限?


2
我相信你可以使用 setfacl 递归地设置(并维护)目录的访问权限。http://linuxcommand.org/man_pages/setfacl1.html - tMC
3
您不想执行 "chmod -R 644 /home" 命令:这会从目录中移除执行权限,导致无法搜索。 - ephemient
针对tMC的评论:如果你想将其应用于特定目录(和可选子目录),而不是绑定到属于特定用户的所有文件和目录,则可以使用ACL。这里有一个类似问题的很好的答案 - cfi
4个回答

106

Debian 和 Ubuntu 都提供了 pam_umask。这使得您可以在 /etc/login.defs 中配置 umask 并使其在整个系统范围内生效,无论用户如何登录。

要启用它,您可能需要在 /etc/pam.d/common-session 中添加一行:

session optional pam_umask.so

或者它可能已经被启用了。然后编辑 /etc/login.defs 并将 UMASK 行更改为

UMASK           002

(默认值为022)。

请注意,用户仍然可以在他们自己的~/.profile~/.bashrc或类似文件中覆盖umask设置,但是(至少在新的Debian和Ubuntu安装中)/etc/profile/etc/bash.bashrc中不应该有任何umask设置被覆盖。 (如果有,请删除它们。)


3
在12.04版本中,它已默认启用。 - Ken J
6
默认情况下,Debian 7 启用此功能。 - earthmeLon
1
如何为一个特定的用户设置自定义umask? - brauliobo
/etc/pam.d/common-session文件中应该放置哪一行?看起来该文件中的行顺序很重要。 - Zero3
谢谢,我刚把它添加到common-session的末尾,在下一个shell登录(deb 11)时它就起作用了。 - Hayden Thring
显示剩余2条评论

30

首先,请确保已安装pam-modules软件包。这将使pam_umask模块可用。然后,确保/etc/pam.d/common-session有一行形式为的内容:

session optional pam_umask.so

为了启用pam_umask功能。

现在,根据pam_umask手册页面的说明,默认的umask值是通过按以下顺序检查以下各个位置来确定登录时的默认值:

  1. /etc/pam.d/common-session中设置的硬系统范围默认值。要以这种方式设置它,请将上述文件中提到的行替换为以下内容:

    session optional pam_umask.so umask=002
    
  2. /etc/passwd中个别用户的GECOS字段中的一项将覆盖该特定用户的软系统范围内的默认设置。使用以下形式的命令创建该条目:

  3. chfn --other='umask=002' username
    
  4. /etc/default/login文件中添加一行形如UMASK=002的内容(如果需要创建该文件),可以设置一个软的系统级默认值。

  5. /etc/login.defs中的UMASK值也用于其他用途(计算正在创建的新用户的家目录权限;有关详细信息,请参见/etc/login.defs中的注释)。因此最好避免依赖它来设置常规登录的默认umask,以保持事物的分离。

因此,在您的情况下,如果希望能够覆盖各个用户的设置,则应将其配置在/etc/default/login中,或者按照上述描述在/etc/pam.d/common-session中设置,以使所有用户都具有相同的设置。

请注意,即使使用硬默认设置,用户仍然可以通过在shell提示符或其.profile脚本中使用umask命令手动覆盖默认的umask

还要注意,设置此默认值的传统Unix方式是向/etc/profile添加一个umask命令,这仍然有效。但这不是在Ubuntu上配置此类事物的推荐方法,因为使用脚本和GUI可靠地进行管理非常困难。

请注意,不幸的是,这种方式无法为已转换为通过systemd --user启动的任何应用程序工作。


3
有一个名为USERGROUPS_ENAB的选项,在某些情况下可以将022更改为002 - Ivan Black
在Ubuntu Server 16.04.1中,软件包libpam-modules包含模块pam_umask。(命令dpkg-query --search /lib/x86_64-linux-gnu/security/pam_umask.so打印出libpam-modules:amd64: /lib/x86_64-linux-gnu/security/pam_umask.so。) - Derek Mahar
3
在Ubuntu Server 16.04.1中,/etc/defaults路径不存在。正确的路径可能是/etc/default/login吗? - Derek Mahar
非常好的完整答案! - kheraud
它也适用于Ubuntu 18.04吗?我的在18.04上无法工作。 - Smile
显示剩余3条评论

0
为了匹配组权限,在服务器上,可以考虑将设置gid位(其中之一的“粘性位”)视为附加选项。
如果共享目录链接到,则启动(使用root): chmod -R 2775 folder_for_the_group 可能会很有趣。
对于在文件夹中创建的任何新文件,创建者将是所有者,但组将自动指定(只要创建者是该组的一部分)。
现在,权限网格显示为-rwxrwsr-x+。

0

我不知道其他发行版,但如果你在使用Debian或Ubuntu,请运行以下命令:

sudo sh -c " echo 'umask 027' > /etc/profile.d/umask.sh"

027更改为最适合您的值。

现在重新启动您的机器。

哇!你完成了。

有关更多详细信息,请查看疯狂关注Ubuntu中的umask!!!!。 要点是,由于我们想保留useradd和userdel行为-并且可能要使用其他帐户的系统默认设置-因此修复方法是取消注释~/.profile中的umask行,然后注销并重新登录。

但是,~/.profile仅适用于特定用户。对于系统范围的更改,您需要在/etc/profile.d/下创建一个文件或将umask 027添加到/etc/profile中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接