我已以 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 #
:
- 输入
who
并记下实际显示号码(包括冒号,如果有) - 对于所需命令(例如
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 中,从而使显示在本地主机上工作。