如何限制用户使用特定的桌面环境?

我正在运行一个更或多或少标准的Ubuntu Precise 12.04安装,并且对使用Unity桌面环境进行日常任务感到非常满意。
然而,当涉及到游戏时,我更喜欢使用LXDE(背景:在当前状态下,Unity的帧率比Unity 2D或LXDE要低得多 - 这是一个已知的错误,并正在修复中)。
为此,我创建了一个游戏用户配置文件,现在我想限制它只能使用LXDE桌面环境。
进一步解释一下:在启动后被要求登录时,我希望在登录屏幕上,游戏用户配置文件只显示LXDE作为选项,而我的标准用户配置文件仍然可以选择使用哪个桌面环境。
提前感谢任何可能有帮助的见解!

它应该将您的最后选择保留为下一次的默认选项。它没有这样做吗?如果它默认选择了正确的桌面环境,您不想要其他选项的原因是什么? - reverendj1
我也注意到了这种行为,就在我问问题之后。基本上,那已经是我想要的,也是我为什么提问的原因。除此之外,我还对解决方案很感兴趣 - 我需要更多了解关于群组和权限的知识。我非常惊讶这似乎是一个如此棘手的问题。难道无法解决吗? - FuzzyQ
3个回答

好的,根据我对LightDM(登录管理器)的理解,似乎不支持限制特定用户的桌面环境。这是一个全盘接受或者完全不接受的交易。默认情况下,当用户选择一个桌面环境时,它将成为他们的默认桌面环境。下次登录时,除非他们选择另一个桌面环境,否则他们将登录到他们的默认桌面环境。
然而,您可以使用户无法更改此设置。这个用户仍然可以选择不同的桌面环境,但如果他们这样做,它不会改变他们的默认设置。我认为这是最安全的方法,如果您不担心该人会更改它。您只需要编辑他们的.dmrc文件(位于他们的主目录中,即/home/user)。这是存储他们默认会话的地方。在该文件中更改Session变量为您想要的任何值,例如ubuntu是默认的Unity桌面环境,ubuntu-2d是Unity 2D,LXDE是LXDE。为了确保在使用其他桌面环境登录时不会更改它,我们可以将其设置为不可变(无法更改)。
sudo chattr +i /home/user/.dmrc

现在除非您移除不可变标志,否则没有人能够更改该文件(包括根目录和其他程序)。
sudo chattr -i /home/user/.dmrc

如果您绝对不希望该用户使用其他桌面环境登录,我确实找到了一种非常巧妙的方法(即自担风险)来实现这一点。我有点无聊,觉得这是一个有趣的尝试。LightDM可以看到的所有不同的桌面环境都保存在/usr/share/xsessions目录下,以.desktop文件的形式存在。顺便说一句,您可以删除任何您不想在登录界面上显示的桌面环境(但这将对所有用户生效)。如果您打开其中任何一个文件,它们都相当简单明了。它们是基本的桌面启动器文件,就像桌面上的所有快捷方式一样。每个文件都包含一个Exec行,这是在登录界面选择桌面环境时执行的命令(即启动哪个桌面环境)。我们将利用这一点来检查登录的用户。如果用户是受限制的用户,我们将强制他们使用特定的桌面环境。
首先,对于在/usr/share/xsessions/中的每个.desktop文件,您需要在/usr/local/bin中创建一个脚本。以ubuntu.desktop为例,这是Unity DE,并且我们将强制我们的受限用户(restricteduser)使用LXDE作为DE。查看LXDE.desktop,我们可以看到Exec命令是/usr/bin/startlxde,并且没有TryExec命令。当您打开ubuntu.desktop时,我们看到Exec命令是gnome-session --session=ubuntu,而TryExec命令是unityTryExec命令就是它听起来的样子。在运行Exec命令之后,它将尝试运行TryExec命令,但如果失败,它不会崩溃。
现在,我们可以根据从.desktop文件中获取的命令来创建我们的脚本。我们将把它们放在/usr/share/bin目录下。我们需要创建两个脚本,一个用于Exec命令,另一个用于TryExec命令。我们可以这样做:

ubuntude.sh

#!/bin/bash

if [ `/usr/bin/whoami` = "restricteduser" ] ; then
   /usr/bin/startlxde
else
   gnome-session --session=ubuntu
fi

ubuntudetry.sh

#!/bin/bash

if [ `/usr/bin/whoami` != "restricteduser" ] ; then
   unity
fi

我们只是在测试登录的人是否是我们的受限用户,并启动相应的DE。现在,我们需要确保他们是可执行的。
sudo chmod +x /usr/local/bin/ubuntude.sh
sudo chmod +x /usr/local/bin/ubuntudetry.sh

我们现在需要更改我们的ubuntu.desktop文件,以便它调用我们的脚本,而不是实际的桌面环境。在文件中注释掉ExecTryExec行,并将其替换为以下内容:
Exec=/usr/local/bin/ubuntude.sh
TryExec=/usr/local/bin/ubuntudetry.sh

只需重复这个过程,针对你可能拥有的其他桌面环境。如果某个桌面环境没有TryExec,那么也就不需要为它创建一个detry.sh脚本,因为LXDE并不使用TryExec。显然,这有点破解的味道,你应该确保在编辑文件之前备份它们,但是如果你绝对需要确保用户登录到正确的桌面环境,这个方法是可行的。

1首先,非常感谢您详细的回答!这是一个相当巧妙的方法。但是,如果我理解最后一部分正确的话,它将强制限制用户登录到lxde,无论他在lightdm中选择了哪个选项。但它仍然会显示在/usr/share/xsessions/中列出的所有其他选项,我理解得对吗?在这种情况下,我更愿意选择选项1。很遗憾没有用户特定的选项来设置桌面环境会话。从用户文件夹中删除不需要的xsessions既方便又简单。 - FuzzyQ
1不客气。我有点把它当作一个挑战,而且我一直想深入研究LightDM。对,用户仍然会看到所有其他选项,但这并不重要,因为他们将被强制使用LXDE。就像我说的,.dmrc文件用于保留用户特定的默认设置,但是,是的,并没有内置的方法来强制用户只能使用特定的桌面环境,或者限制他们可以看到/使用哪些桌面环境。要么全部都可以使用,要么全部都不能使用,除非使用我提出的方法。 - reverendj1
哈哈哈 这就是方法... :) 是的,没有本地解决方案。 - Konstantinos

在Debian Squeeze和Wheezy上,您还可以添加一个包含一行代码的.xsessionrc文件:
export STARTUP=XXX
(其中XXX是您强制使用的会话脚本,请参考上面的Exec-Line),将其放置在用户主目录中,以无论用户选择什么会话类型都强制使用特定的会话类型。
在Ubuntu上也应该适用。
(查看/etc/X11/Xsession.d/40x11-common_xsessionrc和50x11-common_determine-startup,了解为什么这样做有效)

reverendj1的答案对我无效。原因可能是在Exec=中指定的值并不直接执行,而是作为参数传递给/etc/X11/Xsession。(来源:https://askubuntu.com/a/857420/873016

问题的另一个解决方案:
1. 备份所有/usr/share/xsessions/.desktop文件
2. 删除所有/usr/share/xsessions/
.desktop文件
3. 仅创建/usr/share/xsessions/default.desktop文件

[Desktop Entry]
Name=Default
Comment=This session is the default session. It will look up the user specific desktop session in ~/.xsession.
Exec=default

"default" 是 Xsession 的关键词,它将在用户目录中查找特定的会话。
4. 现在为每个用户名创建 /home/{username}/.xsession 文件。对于类似“展示屏”的应用程序,文件内容应如下所示:

#!/bin/bash

cd /home/{yourUsername}/ && ./startApplication.py
logout

如果允许其他用户启动完整的桌面管理器,可以像这样:
#!/bin/bash

exec icewm-session

确保~/.xsession文件可执行
sudo chmod +x ~/.xsession

在Ubuntu 16.04上使用LightDM进行了测试。