我正在为现场支持人员开发笔记本GUI应用程序(即,任何时候只有一个用户登录系统)。在用户定义的会话中只启动了一个用户应用程序(即在Ubuntu Greeting上的/ usr / share / xsession /启动GUI应用程序中只有一个桌面格式文件)。当用户启动时,会要求他登录,当登录成功时,应用程序启动。当他/她退出时,会再次显示Ubuntu Greeting。
用户拥有单独的帐户(例如:用户1 ,用户2 ,用户3 ...),并且所有用户都属于同一个主要用户组(例如: tnet )并且都具有以组命名的相同主目录(例如:" / home / tnet")。我还创建了与组名对应的用户(但不允许他登录)。所有用户共享umask 002,使他们可以访问其他用户创建的文件。
一切正常对第一个用户(例如 user1 )有效,但GUI应用程序在第一个用户退出后无法运行而另一个用户尝试登录(例如 user2 )。在我的python程序中执行第一个语句之一时它失败了:
root=Tk() ... _tkinter.TclError: couldn't connect to display "localhost:10.0"
原因是$ HOME / .Xauthority中的隐藏文件仍由 user1 拥有权限600,程序无法为 user2 打开此文件。还有其他隐藏文件/目录具有类似模式(即不允许其他用户打开):
-rw------- 1 user1 tnet 414 Jun 9 12:09 .bash_history drwx------ 10 user1 tnet 4096 Jun 9 12:11 .cache drwx------ 3 user1 tnet 4096 Jun 2 15:06 .compiz drwx------ 14 user1 tnet 4096 Jun 3 11:27 .config drwx------ 3 user1 tnet 4096 Jun 2 15:13 .dbus drwx------ 3 user1 tnet 4096 Jun 3 11:26 .gconf -rw------- 1 user1 tnet 946 Jun 3 11:26 .ICEauthority drwx------ 3 user1 tnet 4096 Jun 2 15:06 .local -rw------- 1 tunet tnet 101 Jun 8 13:40 .Xauthority -rw------- 2 user1 tnet 0 Jun 9 12:11 .Xauthority-c -rw------- 2 user1 tnet 0 Jun 9 12:11 .Xauthority-l -rw------- 1 user1 tnet 593 Jun 3 15:00 .xsession-errors -rw------- 1 user1 tnet 1156 Jun 3 14:54 .xsession-errors.old
如果我手动将模式更改为660 for .Xauthority,我的GUI程序适用于 User2 。
我的问题是如何避免这个问题以及其他具有600模式的隐藏文件/目录可能存在的其他问题,我几乎不知道它们的用途是什么?再次只允许一个用户登录系统。
PS。 它不仅仅是$ HOME / .Xauthority的模式:当我写这个问题时,为了捕捉正在发生的事情,我远程登录ssh -Y user2 @(在这种情况下,在登录工作之前更改模式)。但是当我以user2身份登录本地时它根本不起作用 - 我看到的只是Ubuntu启动画面:-(更准确地说是在文件中.xsession-errors:
init:/home/tunet/.config/upstart: Unable to load configuration: Permission denied init: dbus pre-start process (2658) terminated with status 1
因此我的问题不仅限于.Xauthority的文件模式。也许我必须完全改变方法。
答案 0 :(得分:0)
嗯,答案是:不要为所有用户使用相同的主目录!首先这是个坏主意。而是将文件.xsession放在所有用户都有权访问的目录中。 (例如:/ usr / local / common /)
因此,要为系统的所有用户(而不是ubuntu桌面)运行相同的应用程序,我使用了@Takkak提供的问题How to share home directory for different users of GUI desktop application?的答案,修改了文件 custom.desktop中的Exec指令指向 /usr/local/common/.xsession ,创建 .xsession 文件,然后运行gui应用程序。所有用户都必须定义主要组(例如tnet)。 / usr / local / common / 的组所有权及其内容也必须为tnet。如果您不希望在Ubuntu问候语中选择任何其他桌面,请从 / usr / share / xsession / 中删除 * .desktop ,但custom.desktop除外。