xhost:无法打开显示“0”

xhost:无法打开显示“0”

我已以 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

答案1

由于某种原因(很可能与我是前面提到的新手有关),虽然echo $DISPLAY返回:0,但如果我输入,who我会看到我的显示实际上是:1(?!),这样如果我调用DISPLAY=:1 /usr/local/stata/stata-mp该程序就会启动而不会出现错误。

重申我的解决方案unable to open display #

  1. 输入who并记下实际显示号码(包括冒号,如果有)
  2. 对于所需命令(例如xhost/usr/local/stata/stata-mp),请输入DISPLAY=[INSERT NUMBER YOU NOTED HERE] [x COMMAND HERE]

我会乐意赞成并接受另一个答案,这可以帮助我理解这种看似不一致的行为。

答案2

任何 xauth 或 xhost 方案都不允许 root 从通过“su”运行 root 的终端或使用“sudo”启动的应用程序在 Debian 10(Buster)或 Ubuntu 20.04 中打开显示。

有人(我不记得是谁)发帖(我不记得在哪里)将以下行添加到 /etc/pam.d/su 和 /etc/pam.d/sudo:

会话可选 pam_xauth.so

如果 (a) 更容易找到,或 (b) 在分布上如此,将会很有帮助。

答案3

尝试xhost +si:localuser:root

这会告诉您正在使用的 xserver(无论是在显示器:0 还是:1,还是其他任何地方)接受来自称为“root”的本地用户的连接 - 即具有 SUID 为 root 的程序,或者您sudo之前所做的。

答案4

在 sudo 下(或以 root 身份)运行 X 窗口通常会失败,并出现unable to open display ..。我没有尝试修改

/etc/pam.d/su and /etc/pam.d/sudo

文件,但另一个小解决方法修复了显示(作为 root)ala 此脚本:

#!/bin/bash

X=`xauth list $DISPLAY`
sudo  -- bash -c "xauth add $X && $@"

将其另存为,xsudo.sh像普通sudo命令一样说出来并调用它

> xsudo.sh gparted

它只是将您的每个用户的 xauth cookie 添加到根帐户的 cookie 中,从而使显示在本地主机上工作。

相关内容