我已经以 root 身份安装了 /usr/local/stata/xstata-mp,权限为 755。
当我尝试通过终端从非 root 帐户运行该程序时,我得到:
user@host ~ % /usr/local/stata/xstata-mp
(xstata-mp:8030): Gtk-WARNING **: 10:09:24.384: cannot open display: 0
“这很奇怪,”我想,我只知道我DISPLAY=0
在我的 .zshrc 中设置了,“好吧,也许我需要在运行这个命令时明确地这样做?” 所以我尝试:
user@host ~ % DISPLAY=0 /usr/local/stata/stata-mp
(xstata-mp:8201): Gtk-WARNING **: 10:13:28.638: cannot open display: 0
编辑:根据@steeldriver 的评论,我也尝试过 DISPLAY=:0
我想了一下,发现为什么 gksu/gksudo 或使用 sudo 启动图形应用程序不能与 Wayland 一起使用?这似乎很有希望(虽然我没有使用 Wayland,但我在 Ubuntu 18.10 上并且仍然安装了 Wayland)。我以 user@host 身份尝试以下命令,并在管理帐户中以 su 身份尝试:
user@host ~ % xhost -si:localuser:root
xhost: unable to open display "0"
我感到绝望,并尝试:
user@host ~ % DISPLAY=0 xhost -si:localuser:root
xhost: unable to open display "0"
我尝试了其他显示号码都无济于事。我认为“我是一个新手,也许localhost
真的意味着 [本地用户] 并尝试使用上述排列。
user@host ~ % xhost -si:user:root
xhost: unable to open display "0"
原来我是一个新手,但这并没有帮助。:)
我怎样才能让 xhost 魔法发生,这样 Gtk 就不会出错,我可以启动我的应用程序(作为 user@host)?
编辑 2019 年 3 月 22 日:
pgrep -a Xorg
3907 /usr/lib/xorg/Xorg vt1 -displayfd 3 -auth /run/user/123/gdm/Xauthority -background none -noreset -keeptty -verbose 3
7370 /usr/lib/xorg/Xorg vt2 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -background none -noreset -keeptty -verbose 3
出于某种原因(很可能与我是前面提到的新手有关),虽然
echo $DISPLAY
返回:0
,但如果我输入who
我看到我的显示实际上是:1
(?!),所以如果我调用DISPLAY=:1 /usr/local/stata/stata-mp
程序启动没有错误。重申我的解决方案
unable to open display #
:who
并记下实际的显示编号(包括冒号,如果存在)xhost
, 或/usr/local/stata/stata-mp
),键入DISPLAY=[INSERT NUMBER YOU NOTED HERE] [x COMMAND HERE]
我很乐意投票并接受另一个答案,它可以帮助我理解这种看似不一致的行为。
尝试
xhost +si:localuser:root
这告诉您正在使用的 xserver(无论是在显示 :0 或 :1 上,还是在任何地方)接受来自称为“root”的本地用户的连接 - 即具有 SUID 的程序到 root,或者您
sudo
在前面所做的。xauth 或 xhost 方案均不允许 root 从运行 root 的终端通过“su”或使用“sudo”启动的应用程序打开 Debian 10 (Buster) 或 Ubuntu 20.04 中的显示。
有人(我不记得是谁)发布了(我不记得在哪里)将以下行添加到 /etc/pam.d/su 和 /etc/pam.d/sudo:
会话可选 pam_xauth.so
如果 (a) 更容易找到,或者 (b) 在分发中以这种方式查找,那将会很有帮助。
在 sudo(或以 root 身份)下运行 X 窗口通常会失败并显示
unable to open display ..
. 我没有尝试修改/etc/pam.d/su and /etc/pam.d/sudo
文件,但另一个小解决方法修复了显示(作为根)ala 这个脚本:
将其另存为,说
xsudo.sh
并像普通sudo
命令一样调用它ala> xsudo.sh gparted
它只是将您的每用户 xauth cookie 添加到 root-accounts cookie,从而使显示在 localhost 上工作。