it-swarm.cn

打开远程X显示器上的窗口(为什么“无法打开显示器”)?

很久以前,

DISPLAY=:0.0 totem /path/to/movie.avi

从笔记本电脑ssh进入我的桌面后,会导致图腾播放movie.avi在我的桌面上。

现在,它给出了错误:

No protocol specified
Cannot open display:

当两台计算机都稳定下来时,我重新安装了Debian squeeze,我想我打破了配置。

我已经用谷歌搜索了,无法终生弄清楚我应该做的事情。

(VLC具有一个可以正常工作的HTTP接口,但它不如ssh方便。)

当我尝试从cron作业运行此问题时,也会出现相同的问题。

83
justin cress

(改编自 Linux:当通过ssh + screen启动会话时wmctrl无法打开显示

显示和权限

X程序需要两条信息才能连接到X显示器。

  • 它需要显示的地址,在本地登录时通常为_:0_,在远程登录时通常为_:10_,_:11_(但可以根据活动的X个连接数进行更改)。显示的地址通常在DISPLAY环境变量中指示。

  • 它需要显示密码。 X显示密码称为魔法饼干。不可直接指定魔术cookie:它们始终存储在X授权文件中,该文件是“显示_:42_具有cookie _123456_”形式的记录的集合。 X授权文件通常在XAUTHORITY环境变量中指示。如果未设置_$XAUTHORITY_,程序将使用_~/.Xauthority_。

您正在尝试对桌面上显示的窗口执行操作。如果您是唯一使用台式机的人,则显示名称很有可能是_:0_。查找X授权文件的位置更加困难,因为在Debian squeeze或Ubuntu 10.04下设置的gdm,它位于一个具有随机生成名称的文件中。 (您之前没有问题,因为早期版本的gdm使用了默认设置,即存储在_~/.Xauthority_中的cookie。)

获取变量的值

以下是获取DISPLAYXAUTHORITY的值的几种方法:

  • 您可以从桌面上系统地启动屏幕会话,或者自动在登录脚本中(从_~/.profile_开始);但是只有在X下登录时才能这样做:测试DISPLAY是否设置为以_:_(应该涵盖您可能遇到的所有情况)。在_~/.profile_中:

    _case $DISPLAY in
      :*) screen -S local -d -m;;
    esac
    _

    然后,在ssh会话中:

    _screen -d -r local
    _
  • 您还可以将DISPLAYXAUTHORITY的值保存在文件中,然后调用这些值。在_~/.profile_中:

    _case $DISPLAY in
      :*) export | grep -E '(^| )(DISPLAY|XAUTHORITY)=' >~/.local-display-setup.sh;;
    esac
    _

    在ssh会话中:

    _. ~/.local-display-setup.sh
    screen
    _
  • 您可以从正在运行的进程中检测DISPLAYXAUTHORITY的值。这很难自动化。您必须弄清楚连接到要处理的显示器的进程的PID,然后从_/proc/$pid/environ_(eval export $(</proc/$pid/environ tr \\0 \\n | grep -E '^(DISPLAY|XAUTHORITY)=')¹)获取环境变量。

复制cookie

另一种方法(遵循 Arrowmaster 的建议)是不尝试在ssh会话中获取_$XAUTHORITY_的值,而是使X会话将其cookie复制到_~/.Xauthority_。由于cookie每次登录时都会生成,因此如果将过时的值保留在_~/.Xauthority_中就没有问题。

如果您的主目录可以通过NFS或其他网络文件系统访问,从而允许远程管理员查看其内容,则可能存在安全问题。他们仍然需要以某种方式连接到您的计算机,除非您启用了X TCP连接(Debian默认关闭了它们)。因此,对于大多数人来说,这都不适用(无NFS)还是没有问题(无X TCP连接)。

要在登录桌面X会话时复制cookie,请在_~/.xprofile_或_~/.profile_(或登录时读取的其他脚本)中添加以下行:

_case $DISPLAY:$XAUTHORITY in
  :*:?*)
    # DISPLAY is set and points to a local display, and XAUTHORITY is
    # set, so merge the contents of `$XAUTHORITY` into ~/.Xauthority.
    XAUTHORITY=~/.Xauthority xauth merge "$XAUTHORITY";;
esac
_

¹ 原则上,这没有适当的引号,但在此特定情况下_$DISPLAY_和_$XAUTHORITY_将不包含任何Shell元字符。

81

我通过添加解决了这个问题

xhost +si:localuser:$USER

~/.xprofile。我不知道这是否完全安全(我会对听到更多有见识的人们的想法很感兴趣),但是我想这比关闭访问控制(用xhost +),这是在您搜索该问题时通常建议的。

20
edam

你需要 export DISPLAY=:0.0

7
asoundmove

为我工作,debian wheezy-> ubuntu trusty。

注意:在这种情况下,服务器未运行显示管理器,它是没有图形卡或监视器的“无头”虚拟机。

[email protected]:~$ grep -iB 1 tcp /etc/gdm3/daemon.conf
[security]
DisallowTCP = false
[email protected]:~$ ssh -C -R 6000:127.0.0.1:6000 [email protected]
X11 forwarding request failed on channel 0
[email protected]:~$ export DISPLAY=:0.0
[email protected]:~$ xterm

笔记本电脑上的X显示屏显示服务器上运行的xterm的输出。

调试使用:

[email protected]:~/tmp$ nc -v 127.0.0.1 6001
localhost [127.0.0.1] 6001 (x11-1) : Connection refused
[email protected]:~/tmp$ nc -v 127.0.0.1 6000
localhost [127.0.0.1] 6000 (x11) open
[email protected]:~$ nc -v 127.0.0.1 6000
Connection to 127.0.0.1 6000 port [tcp/x11] succeeded!*
[email protected]:~$ strace xterm

strace将散布大量有关其操作的详细信息,您应该能够猜测其卡住的位置-等待连接或执行任何操作。

在一行中..

ssh -C -R 6000:127.0.0.1:6000 [email protected] "DISPLAY=:0.0 xterm"
3
jmullee