【问题标题】:Docker with shared X11 socket: Why can it "start" Firefox outside of the container?具有共享 X11 套接字的 Docker:为什么它可以在容器外“启动”Firefox?
【发布时间】:2015-03-11 13:01:07
【问题描述】:

我有以下场景:

  1. 我设置了一个可以访问 X11 套接字的 Docker 容器,基本上我是这样做的:https://stackoverflow.com/a/25334301
  2. 然后我在容器中安装了 Firefox,并在 bash 中使用“firefox”命令启动它。

我注意到:如果 Firefox 在我在容器中启动时已经在我的主机上运行,​​它本质上是“逃逸”了容器,因为它只是打开了 Firefox 主机实例的新窗口。因此,它可以访问主机上的所有内容,并且容器变得无用。

反之亦然:如果 Firefox 没有在主机上运行,​​而我在容器中启动了一个实例,它实际上是在容器内运行。如果我随后在主机上启动 Firefox,新实例也在容器内运行。

但是,我无法使用 gvim 而不是 Firefox 重现此行为。

我很清楚 X11 套接字共享固有的安全问题,但我无法解释我上面描述的场景。为什么容器可以在其受限环境之外启动一个“进程”——或者更确切地说是一个窗口?我的主机系统怎么可能仅仅因为同一个程序已经在容器中运行而在容器中启动一个进程?

(请注意,除了“进程”之外,我不知道如何调用程序的这种图形实例,尽管在这种情况下它可能不是真正的进程......)

系统:Ubuntu GNOME 14.10、Docker 1.5、ubuntu:最新的 Docker 镜像。

更新:如果我使用 -new-instance 标志启动 Firefox,则不会发生这种情况,因此它似乎更像是 Firefox 问题而不是 X11 套接字问题。

更新 2:似乎这也发生在其他场景中,例如使用带有 X-forwarding 的 ssh:
https://unix.stackexchange.com/questions/104476/why-starting-firefox-from-command-line-in-vm-starts-the-firefox-in-the-host-ma

https://superuser.com/questions/462055/launching-firefox-on-remote-server-causes-local-firefox-to-open-the-page-instead

现在的问题是,Firefox 到底是如何做到这一点的?他们使用什么样的 X11 魔法来确定 Firefox 是否已经在运行?

【问题讨论】:

    标签: sockets user-interface firefox docker x11


    【解决方案1】:

    因为您将 x11 套接字转发到容器中,所以任何图形程序,无论是在容器内部还是容器外部,都将与同一个 Xorg 服务器通信。这与将 ssh 与 X-forwarding 一起使用时相同。

    现在假设一个 firefox 实例已经启动并与该 xserver 通信。如果我们是启动的第二个 firefox 进程,我们可能会从根目录中通过navigating the window tree 找到第一个进程。我们也许可以通过some properties 来识别一个属于firefox 的窗口,它设置在它的窗口上。一旦我们找到一个属于 firefox 的窗口,我们可能会 send a message 到拥有该窗口的进程,要求它添加一个新选项卡。

    也许如果我们找到这样一个进程并要求它打开一个新选项卡,我们就会在工作完成时死掉。

    当然,我们总是可以只用look at the source 并发现firefox 确实做到了这一点。特别是他们:

    但他们不会通过客户端消息通知它。他们通过更改窗口属性来做到这一点。大概创建窗口的进程也订阅了属性更改通知。如果您对代码的完整路径感到好奇:

    • 从解析命令行,StartRemoteClient
    • 其中creats a client(请注意,他们也在d-bus/wayland上执行此操作)然后调用SendCommandLine()
    • 这是一个虚函数,所以找到它覆盖XRemoteClient
    • 在那里您可以看到它调用链接到FindBestWindow()DoSendCommandLine() 的前两个函数的位置。

    【讨论】:

      猜你喜欢
      • 2022-07-18
      • 2021-04-16
      • 1970-01-01
      • 2017-12-13
      • 2017-03-14
      • 2016-09-14
      • 1970-01-01
      • 2014-09-07
      • 2017-07-02
      相关资源
      最近更新 更多