如何为整个 gnome 会话设置“umask”?

如何为整个 gnome 会话设置“umask”?

使用 Gnome 3.18。我在其他家庭成员之间共享文件,但我的发行版 (archlinux) 上的默认 umask 是0022.因此,创建的每个文件/目录对于我们的公共组来说都是不可写的。

我尝试输入,umask 0002/etc/profilegnome 会话仍在使用0022.不过,它适用于登录 bash shell。

我还尝试在 中添加这一行/etc/pam.d/system-auth session required pam_umask.so umask=0002 它与 中的效果相同/etc/profile。我试过

如果我在 gnome 终端 shell 中手动更改 umask,然后我从中启动一个应用程序(例如 gedit),那么由它创建的文件将具有所需的权限。如果我从 gnome 菜单启动 gedit,则不会。所以我的问题实际上是为 gnome 会话设置 umask,但我找不到在哪里执行此操作。

编辑(回答 Gilles 的评论):我使用 gdm 3.18 作为 DM。我还尝试将 pam_umask 行添加到/etc/pam.d/gdm-launch-environment.所有其他gdm-*文件都包含来自sessionsystem-auth文件的内容,因此它们不需要更多。它不会改变任何东西。

/etc/login.defs包含UMASK 077,但USERGROUPS_ENAB yes还应将其设置umask00770007对于主要组为用户名的用户。

022包含 umask 的唯一文件/etc是,/etc/profile但这是我的第一次尝试。

至于/etc/Xsession.d,我没有这个目录。此外,由于 Wayland 现在是默认显示服务器,我不确定 umask 是否应该设置为 X 初始化的一部分,即使我自己仍在使用它。

答案1

某些 Gnome 应用程序由 启动systemd --user,在这种情况下 umask 由 systemd 设置为,0022无论配置的值如何pam_umask。我不知道有任何解决方法,但我打开了一个问题在 systemd github 问题跟踪器上。这个问题也被报道过侏儒 bugzilla

pam_umask对于不是由 启动的应用程序,umask set using可以按预期工作systemd --user

建议一种解决方法Ubuntu bugzilla 将 systemd 服务覆盖到所有受影响的应用程序。

更新:对于 systemd 版本 246 及更高版本,pam_umask 应按预期工作。较新的发行版应该附带修复了错误的版本。


自己调查一下

您可以使用以下命令以树形格式(父/子进程)列出系统上运行的进程:

pstree -Tapu

寻找PID为了:(1)您的会话实例系统d--用户;(2) 由它启动的应用程序,例如 gedit,它将显示为子进程系统d--用户;和(3)您会话中的一个进程不是由 systemd --user 启动的

比较掩码报道于进程文件系统:

grep Umask /proc/<pid>/status

系统d--用户本身(1)和流程不是由其发起(3)应该有正确的umask这是由设置的pam_umask。进程启动者系统d--用户 (2)将有 umask 0022

答案2

要在系统范围内设置默认 umask,您必须首先启用它,这在这里得到了很好的解释:

http://manpages.debian.org/cgi-bin/man.cgi?query=pam_umask&sektion=8

上面的链接适用于 debian 和 ubuntu,但对于所有其他 Linux 系统也是如此。

要启用 umask (可能已经存在),您需要添加一行/etc/pam.d/common-session

session optional pam_umask.so

启用后,您可以在以下位置进行设置:

/etc/login.defs

我看到你已经找到了这个文件,所以你需要做的就是设置:

# The permission mask is initialized to this value. If not specified,
# the permission mask will be initialized to 022.
UMASK           077

并将其 UMASK 设置为 0002 或任何您想要的值。

这将在系统范围内设置默认值,这意味着所有用户都将从那里获取 umask,除非他们没有在他们的文件中特别设置。轮廓 或者.bashrc

答案3

问题是塞巴斯提到的。我尝试了很多方法,但后来我找到了一种解决方法,其中包括覆盖 dbus 的(每个用户)UMask:

$ systemctl --user edit dbus

在打开的文件中,只需写入:

[Service]
UMask=002 # This is the umask I want to use

该文件保存在 .config/systemd/user/dbus.service.d/override.conf 中,并覆盖 dbus 默认 umask,我认为它是从 systemd --user 继承的,因为 dbus 是由它启动的。只需注销并再次登录,gnome 应用程序就应该使用指定的 umask。只是一个解决方法,但它对我有用。

答案4

编辑:为了让 systemd 设置 gnome 会话的 umask,我在 /etc/systemd/system/display-manager.service.d/ 下创建了一个 umask.conf 文件,其中包含以下几行:


[Service]
UMask=0002

重新启动计算机后,现在允许所有进程user.slice符合您想要的 umask。注销不足以进行更改,因此我建议在执行之前重新启动计算机测试在进程 umask 上。

附加信息:

  • 操作系统:CentOS7.4
  • 德语:Gnome3

相关内容