使用 FreeBSD 8.2。我正在使用ightvnc 通过vnc 访问我的机器。我以普通用户身份登录。这没关系。我可以打开 X 应用程序,它们显示得很好。然后我su到root,他们就打不开。我曾经能够执行 xhost +localhost 但这不再起作用了。我在网上阅读有关复制 .Xauthority 的内容,因此现在在 root 的 .cshrc 中执行以下操作:
if ($user != "root") then
setenv XAUTHORITY /home/$user/.Xauthoriy
endif
这让我更进一步,但现在我收到一个错误:
GLib-GIO:ERROR:gdbusconnection.c:2270:initable_init: assertion failed ..
我在网上搜索了这个,有人说先在命令前加上 dbus-launch 前缀:
dbus-launch emacs
我尝试过这个,它有效,但看起来很笨拙。我如何让它工作,以便我可以在su'ing无缝root后启动基于X的程序(就像我可以使用FreeBSD 6.x一样)?
答案1
好吧,我对此有一个解决办法。这个网站有一个很好的解释https://bugs.launchpad.net/ubuntu/+source/gconf/+bug/336660:
问题的解释如下:
当您从以另一个用户身份登录的终端 su 到 root 时,新的“su-ed”用户将从父 shell 用户继承环境变量。
示例:假设对于用户 jack,DBUS_SESSION_BUS_ADDRESS 环境变量设置为:“unix:abstract=/tmp/dbus-l5SiTFzmR8,guid=1af28c9d83400a896ef6268d4a7af59f” 现在,如果您以 jack 身份打开终端并使用 su 来根 DBUS_SESSION_BUS_ADDRESS 变量应保留为用户插孔。这就是问题所在,正是这个特定的环境。变量 (DBUS_SESSION_BUS_ADDRESS) 会产生该问题。 Gnome 程序,如 gedit、nautilus 。 。 。使用 dbus 协议与存储应用程序特定配置的 gconf 进行通信,而不仅仅是。例如,与以 jack 用户身份执行该程序相比,以 root 身份执行的程序使用不同的 D-Bus 会话总线地址。所以问题是你切换到root,但DBUS_SESSION_BUS_ADDRESS变量仍然指向jack的dbus会话总线地址。
解决方案: root 用户也有一个单独的 dbus 会话地址(位于 /root/.dbus/session-bus/...),因此当您在终端中并“su-ed”到 root 时,请使用 root 的 dbus 地址只需清除 DBUS_SESSION_BUS_ADDRESS 变量即可。例如:export DBUS_SESSION_BUS_ADDRESS="" 需要与 gconf 进行 dbus 通信的程序,检查该环境变量,如果它为空,则从用户 ~/.dbus/session-bus/ 目录(正确的位置)读取 dbus 地址)。要使其永久化,请将以下行添加到 root 用户 .bashrc 文件中:export DBUS_SESSION_BUS_ADDRESS="" 这意味着每次当您 su 到 root 并且终端不是登录 shell 时(当您以 jack 身份登录时的情况)打开终端并执行 su) DBUS_SESSION_BUS_ADDRESS 变量被清除,因此应用程序将从正确的位置读取 dbus 地址。
顺便说一句,您不需要使用 dbus-launch 启动新的 dbus 会话。即使您这样做,但应用程序仍然从错误的位置读取 dbus 地址,问题仍然存在。
当我取消设置 DBUS_SESSION_BUS_ADDRESS 时,我现在可以在 su 后在 X 中启动 emacs。但是我仍然收到警告:
(emacs 1879): GLib-WARNING **: In call to g_spawn_sync()...