使用 Gnome 3.18。我在其他家庭成员之间共享文件,但我的发行版 (archlinux) 上的默认 umask 是0022
.因此,创建的每个文件/目录对于我们的公共组来说都是不可写的。
我尝试输入,umask 0002
但/etc/profile
gnome 会话仍在使用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-*
文件都包含来自session
该system-auth
文件的内容,因此它们不需要更多。它不会改变任何东西。
/etc/login.defs
包含UMASK 077
,但USERGROUPS_ENAB yes
还应将其设置umask
为0077
或0007
对于主要组为用户名的用户。
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