X11转发在docker中运行的GUI应用
首先,我已经阅读了关于SO的类似问题的答案,但是没有一个起作用。
情况:
- 带有GUI的应用程序在Arch Linux下的docker容器(CentOS 7.1)中运行。(机器A)
- 机器A连接了一个监视器。
- 我想通过Arch Linux客户端计算机上的X11转发访问此GUI。(机器B)
什么有效:
- GUI在机器A上本地工作(/tmp/.X11-unix安装在Docker容器中)。
- X11转发任何在docker外部运行的应用程序(X11转发已设置并正确运行以用于非docker使用)。
- 我什至可以在远程登录时切换用户,将
.Xauthority
文件复制到其他用户,并且X11转发也可以。
一些设置信息:
- Docker网络是“桥接”的。
- 容器可以到达主机(防火墙已打开)。
DISPLAY
变量在容器中设置(由于sshd正在侦听的TCP端口6010,因此设置为host-ip-addr:10.0)。- 到达X转发端口(6010)的数据包正从容器(
tcpdump
选中)到达主机。
什么不起作用:
- Docker应用程序的X11转发
- 错误:
X11 connection rejected because of wrong authentication.
xterm: Xt error: Can't open display: host-ip-addr:10.0
我尝试过的事情:
ssh -Y
在计算机B上使用选项启动客户端ssh- 将
"X11ForwardTrusted yes"
ssh_config放在机器B上 xhost +
(因此允许任何客户端连接)在计算机B上- 将
Host *
ssh_config放在机器B上 X11UseLocalhost no
在计算机A上放入sshd_config(以允许非本地客户端)xauth add
使用机器A上的登录用户从容器中添加X auth令牌- 只需将
.Xauthority
文件从工作用户复制到容器中 - 使shure
.Xauthority
文件具有正确的权限和所有者
我如何才能禁用所有X安全功能并使其正常工作?
甚至更好:我如何使其与安全性一起使用?
至少有一种方法可以进行广泛的调试,以查看问题出在哪里?
回答:
好的,这是东西:
1)登录到远程机器
2)检查设置了哪个显示 echo $DISPLAY
3)运行 xauth list
4)复制对应于您的行 DISPLAY
5)输入您的Docker容器
6)xauth add <the line you copied>
*
7)将DISPLAY设置为 export DISPLAY=<ip-to-host>:<no-of-display>
*到目前为止还好吧?
这并不是什么新鲜事……不过,这里有一个转折: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地址。
如上设置DISPLAY变量。
因此错误是DISPLAY
环境变量中的名称与xauth list
/
.Xauthority
文件中的条目不是“相同”的,因此客户端可能无法正确进行身份验证。
我切换回不受信任的X11转发设置。
X11UseLocalhost no
但是,sshd_config文件中的设置很重要,因为传入的连接将来自“不同”的计算机(docker容器)。
以上是 X11转发在docker中运行的GUI应用 的全部内容, 来源链接: utcz.com/qa/431683.html