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

Laz*_*535 2 authentication x11-forwarding docker

首先:我已经阅读了关于SO的类似问题的答案,但没有一个有效.

情况:

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

什么有效:

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

一些设置信息:

  • Docker网络是"桥接"的.
  • 容器可以到达主机(防火墙已打开).
  • DISPLAY 变量在容器中设置(到host-ip-addr:10.0,因为sshd正在侦听的TCP端口6010).
  • 到X前向端口(6010)的数据包从容器到达主机(已tcpdump选中).

什么行不通:

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

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"在机器B上放入ssh_config
  • xhost + (因此允许任何客户端连接)在机器B上
  • Host *在机器B上放入ssh_config
  • X11UseLocalhost no在机器A上放入sshd_config(允许非localhost客户端)
  • xauth add使用计算机A上的登录用户在容器中添加X身份验证令牌
  • 只需将.Xauthority文件从工作用户复制到容器中即可
  • 制作shure .Xauthority文件具有正确的权限和所有者

我怎样才能禁用所有X安全性的东西并让它工作?

甚至更好:我怎样才能让它与安全性一起工作?

是否至少有一种方法可以进行大量调试,以确定问题的确切位置?

chr*_*n0x 9

非常感谢@Lazarus535,
我发现对我来说,将以下内容添加到我的 docker 命令中是有效的:
--volume="$HOME/.Xauthority:/root/.Xauthority:rw"
我在这里找到了这个技巧
编辑:
正如 Lazarus 正确指出的那样,您还必须设置--net=host选项才能使其工作。

  • 在 Docker 中运行 GUI 之前我从未遇到过这个问题。这次我通过两台服务器链接 X11 并收到此权限错误。为其他人附加完整命令 ```docker run -it --network=host --env DISPLAY=127.0.0.1:11.0 --privileged --volume="$HOME/.Xauthority:/root/.Xauthority:rw" - v /tmp/.X11-unix:/tmp/.X11-unix --rm <idockerimage>``` (3认同)

Ame*_*kar 9

这适用于任何场景。

xhost如果没有,请安装。然后,在bash中,

export DISPLAY=:0.0
xhost +local:docker
Run Code Online (Sandbox Code Playgroud)

在此之后运行您的docker run命令(或您正在运行的任何 docker 命令)-e DISPLAY=$DISPLAY


Laz*_*535 7

好的,这是事情:

1)登录远程机器

2)检查设置了哪个显示器 echo $DISPLAY

3)跑 xauth list

4)复制与您对应的行 DISPLAY

5)输入您的泊坞窗容器

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>
Run Code Online (Sandbox Code Playgroud)

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

<ip-of-host>:<no-of-display> MIT-MAGIC-COOKIE-1 <some number here>
Run Code Online (Sandbox Code Playgroud)

实质上:删除/unix部分.

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

像上面一样设置DISPLAY变量.

所以错误是DISPLAY环境变量中的名称与xauth list/ .Xauthorityfile中的条目不是"相同",客户端因此无法正确进行身份验证.

我切换回不受信任的X11转发设置.

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


Ale*_*nen 6

它通常通过/sf/answers/4274236991/工作

ssh -X但是,如果您使用与服务器中使用的用户不同的用户运行 docker ;那么复制 Xauthority 仅有助于映射文件的卷。

示例 - 我使用用户 sshed 进入服务器。alex然后运行 ​​dockersu -root并收到此错误

X11 connection rejected because of wrong authentication.

复制 .XAuthoirty 文件并将其映射为/sf/answers/3584668251/后,它就可以工作了

cp /home/alex/.Xauthority .

docker run  -it --network=host --env DISPLAY=$DISPLAY  --privileged  \
 --volume="$HOME/.Xauthority:/root/.Xauthority:rw"  \
-v /tmp/.X11-unix:/tmp/.X11-unix --rm <dockerimage>

Run Code Online (Sandbox Code Playgroud)

有关接线的更多详细信息,请参见此处https://unix.stackexchange.com/a/604284/121634