在Docker中运行的GUI应用程序的X11转发

首先:我已经阅读了类似的问题的答案,但没有一个工作。

情况:

  • 使用GUI的应用程序在Arch Linux下的Docker容器(CentOS 7.1)中运行。 (机器A)
  • 机器A有一个监视器连接到它。
  • 我想通过我的Arch Linux客户机上的X11转发来访问这个GUI。 (机器B)

什么工作:

  • GUI在本地机器A上工作(将/tmp/.X11-unix安装在Docker容器中)。
  • X11转发任何在Docker外部运行的应用程序(X11转发设置并正确运行,以便非docker使用)。
  • 我甚至可以在远程login时切换用户,将.Xauthority文件复制到其他用户,X11转发也可以。

一些设置信息:

  • Dockernetworking被“桥接”。
  • 容器可以到达主机(防火墙已打开)。
  • 在容器中设置DISPLAYvariables(因为sshd正在侦听的TCP端口6010,所以host-ip-addr:10.0)。
  • 数据包到X转发端口(6010)从容器到达主机( tcpdump被选中)。

什么不行:

  • X11转发Docker应用程序
  • 错误:

X11 connection rejected because of wrong authentication.

xterm: Xt error: Can't open display: host-ip-addr:10.0

我试过的东西:

  • 在机器B上用ssh -Y选项启动客户端ssh
  • 在机器B的ssh_config中放入"X11ForwardTrusted yes"
  • 机器B上的xhost + (允许任何客户端连接)
  • Host *放在机器B的ssh_config中
  • 在机器A的sshd_config中放入X11UseLocalhost no (允许非本地主机客户机)
  • 在机器A上从login用户xauth add容器中的X身份validation令牌
  • 只需将工作用户的.Xauthority文件复制到容器中即可
  • 使舒尔.Xauthority文件具有正确的权限和所有者

我怎样才能禁用所有的X安全的东西,并得到这个工作?

或者甚至更好:我如何才能使它安全工作?

是否至less有一种方法来启用广泛的debugging,看看问题到底在哪里?

好的,这是事情:

1)login到远程机器

2)检查使用echo $DISPLAY设置的echo $DISPLAY

3)运行xauth list

4)复制与您的DISPLAY对应的行

5)input您的docker集装箱

6) xauth add <the line you copied> *

7)使用export DISPLAY=<ip-to-host>:<no-of-display>设置DISPLAY export DISPLAY=<ip-to-host>:<no-of-display>

*迄今如此好的权利?

这不是什么新东西……但是这里是扭曲:由login用户的xauth list打印的行看起来像这样(在我的情况):

 <hostname-of-machine>/unix:<no-of-display> MIT-MAGIC-COOKIE-1 <some number here> 

因为我使用桥接docker设置,X转发端口不在本地监听,因为sshd没有在容器中运行。 将上面的行更改为:

 <ip-of-host>:<no-of-display> MIT-MAGIC-COOKIE-1 <some number here> 

实质上:删除/unix部分。

<ip-of-host>是sshd运行的IP地址。

如上设置DISPLAYvariables。

所以错误在于环境variables中的DISPLAY名称与xauth list / .Xauthority文件中的条目不是“相同的”,因此客户端可能无法正确地进行身份validation。

我切换回不可信的X11转发设置。

然而,sshd_config文件中的X11UseLocalhost no设置很重要,因为input连接将来自“不同”的机器(docker容器)。