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


10

使用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-terminal shell中手动更改umask,则我从中启动应用程序,例如gedit,然后由它创建的文件具有所需的权限。如果我从gnome菜单启动gedit,则不会。所以我的事真的是为gnome会话设置umask,而我找不到在哪里做。

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

/etc/login.defs包含,UMASK 077但也USERGROUPS_ENAB yes应将设置umask为或,0077或者0007将主要组作为用户名的用户设置为。

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

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


您使用什么显示管理器?(这是您输入用户名和密码的程序。)Gdm,lightdm,slim,xdm,kdm…?根据Arch和DM的设置方式,尝试在中添加文件/etc/Xsession.d,或在中添加其他文件/etc/pam.d(我假设您要在整个系统范围内进行设置)。也许吧/etc/login.defs
吉尔(Gilles)'所以,别再邪恶了'

这两个答案对于ttyssh登录均有效,实际上(使用pam_umask)基本上是相同的。他们不适用于我的gnome会话。所以我不能给任何人赏金。我不知道这是否专门针对archlinux上Xorg上的gnome。有空的时候我会和其他发行版一起测试。
Christophe Drevet-Droguet '16

1
在archlinux论坛上有一个类似的线程可以解决该问题:bbs.archlinux.org/viewtopic.php?id=207753似乎是gdm中的错误...

我最终使用了ACL,这是一种更好的控制权限的方法。无需更改默认的更安全权限掩码。
Christophe Drevet-Droguet,

Answers:


6

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

Umask set using pam_umask对于未由启动的应用程序可以正常工作systemd --user

建议在Ubuntu Bugzilla上找到一种解决方法, 以将systemd服务替代放置到所有受影响的应用程序。


自己调查一下

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

pstree -Tapu

查找以下对象的PID(1)您会话的systemd --user实例;(2) 由它启动的应用程序,例如gedit,它将作为子进程显示给systemd --user;和(3)在你的会话中的处理不被systemd --user推出

比较procfs中报告的umask

grep Umask /proc/<pid>/status

systemd --user本身(1)由它启动的进程(3)应该具有由pam_umask设置的正确umasksystemd --user (2)启动的进程的umask为。 0022


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。只是一种解决方法,但对我有用。


2

改为更改,umask您可以使用的usergroups选项pam_umask,此用户和组具有与共享文件夹的经典unix方式相同的权限。

# /etc/pam.d/login or
# /etc/pam.d/common-session or system-auth
session optional pam_umask.so usergroups

1
如果用户不是root用户,并且用户名与主要组名相同,则将umask组位设置为与所有者位相同(示例:022-> 002,077-> 007)。
Christophe Drevet-Droguet '16

我将主要组用作共享组。对于用户组,默认情况下将使用该用户组创建文件,而其他用户则无法编辑文件。
Christophe Drevet-Droguet '16

1
不过,我看到了一种方法:我可以使用用户组和公用的辅助组,然后在共享树上添加“设置组”位,以在所有创建的文件和文件夹上强制使用该公用组。无论如何,我稍后将在PC上尝试。我不确定gnome是否会关心它,因为无论tty会话如何工作,它总是将0022作为umask。
Christophe Drevet-Droguet '16

1

要在整个系统范围内设置默认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,除非他们没有在.profile.bashrc中特别设置其他设置


谢谢您的回答。我必须尝试一下。我并不乐观,因为我已经使用内联参数“ umask = 0002”尝试了该PAM模块,但是它不起作用(对于Gnome,它确实适用于其他登录外壳)。我会尝试你的建议。
Christophe Drevet-Droguet

您尝试了针对系统身份验证而非公共身份验证的pam模块:-)
ostendali

3
这只是文件名分布选择的问题。我知道debian common-*用于常规设置。作为RedHat,Arch system-auth为此使用了一个文件。无论如何,我想你加入的建议session optional pam_umask.so,并与UMASK 002/etc/login.defs如我所料,并与pam_umask.so umask=0002,它的工作对一个tty login会话(或通过SSH),但侏儒设置0022的umask一如既往。Gnome必须使用内部umask设置,或者archlinux正在使用一个…我将尝试另一种发行版以查看是否也出现了该问题。
Christophe Drevet-Droguet

1

对于登录会话:添加umask 0002到您的$HOME/.profile(或/etc/profile)。

对于Gnome会话:添加umask 0002到您的$HOME/.gnomerc


1

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


[Service]
UMask=0002

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

附加信息:

  • 作业系统:CentOS7.4
  • 德国:Gnome3

3
如果工作正常,则/etc/systemd/system/gdm.service.d/umask.conf仅包含文件[Service]\nUMask=0002就足够了。
Christophe Drevet-Droguet

确实如此!刚刚在那里测试。我的/ etc / systemd / system /文件夹包含一个指向gdm.service的符号链接,因此我创建了一个display-manager.service.d / umask.conf并添加了这一行,这很完美,打算更新答案以包含它。您@ ChristopheDrevet-Droguet
jamalm '18

0

只是想补充一下,pam_umask手册页提供了一些非常好的信息,以帮助您弄清umask的来源。特别:

pam_umask是一个PAM模块,用于设置当前环境的文件模式创建掩码。umask影响分配给新创建文件的默认权限。

PAM模块尝试按以下顺序从以下位置获取umask值:

·   umask= argument
·   umask= entry of the users GECOS field
·   pri= entry of the users GECOS field
·   ulimit= entry of the users GECOS field
·   UMASK= entry from /etc/default/login
·   UMASK entry from /etc/login.defs

就像有人说过的那样,您应该common-session在目录下的文件中进行设置/etc/pam.d

请注意,不使用pam的登录名(例如使用gettylogin将通过设置umask的登录名)login.defs


0

在安装了Gnome的Fedora 29上,我发现,从Gnome启动器启动的程序留下了其他可读的文件0022。Pam显然遵从了/etc/login.defs。但是,在那里编辑遮罩0077并没有改变Gnome的行为。我还必须编辑/ etc / profile,以及/ etc / bashrc-两者都将其设置回0022。

如果Fedora有一个位置可以很好,但是/ etc / profile和/ etc / bashrc中的条目为ID大于或小于200的用户设置了不同的掩码,因此似乎一个掩码不能完全适用。

尽管目前这是一个修复程序,但问题尚未完全解决,因为gnome用户仍然无法设置自己的umask,因为它已应用于从gnome启动器运行的应用程序。似乎Gnome应该对该umask具有config选项。(也许是,但是我没有找到。)


0

我至少在Fedora 31上有解决方法:

sudo vi /etc/profile.d/umask.sh
umask <your_umask>

sudo vi /etc/login.defs
UMASK <your_umask>

sudo vi /usr/local/bin/systemd-user
/usr/lib/systemd/systemd --user

sudo chmod a+x /usr/local/bin/systemd-user

sudo vi /usr/lib/systemd/system/user@.service
ExecStart=-/usr/local/bin/systemd-user
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.