Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 具有共享X11套接字的Docker:为什么它可以;“开始”;容器外的Firefox?_Sockets_User Interface_Firefox_Docker_X11 - Fatal编程技术网

Sockets 具有共享X11套接字的Docker:为什么它可以;“开始”;容器外的Firefox?

Sockets 具有共享X11套接字的Docker:为什么它可以;“开始”;容器外的Firefox?,sockets,user-interface,firefox,docker,x11,Sockets,User Interface,Firefox,Docker,X11,我有以下情况: 我设置了一个可以访问X11套接字的Docker容器,基本上我是这样做的: 然后我在容器中安装了Firefox,并在bash中使用“Firefox”命令启动它 我注意到:如果当我在容器中启动Firefox时,Firefox已经在我的主机上运行了,那么它实际上是“逃逸”了容器,因为它刚刚打开了Firefox主机实例的一个新窗口。因此,它可以访问主机上的所有内容,并且容器变得无用 反之亦然:如果Firefox没有在主机上运行,并且我在容器中启动了一个实例,那么它实际上是在容器中运行的。

我有以下情况:

  • 我设置了一个可以访问X11套接字的Docker容器,基本上我是这样做的:
  • 然后我在容器中安装了Firefox,并在bash中使用“Firefox”命令启动它
  • 我注意到:如果当我在容器中启动Firefox时,Firefox已经在我的主机上运行了,那么它实际上是“逃逸”了容器,因为它刚刚打开了Firefox主机实例的一个新窗口。因此,它可以访问主机上的所有内容,并且容器变得无用

    反之亦然:如果Firefox没有在主机上运行,并且我在容器中启动了一个实例,那么它实际上是在容器中运行的。如果在主机上启动Firefox,那么新实例也会在容器中运行

    然而,我无法用gvim而不是Firefox重现这种行为

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

    (请注意,我不知道如何调用除“进程”之外的程序的图形实例,尽管在本例中它可能不是真正的进程…)

    系统:Ubuntu GNOME 14.10,Docker 1.5,Ubuntu:最新Docker图片

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

    更新2:这似乎也发生在其他场景中,例如使用ssh和X-forwarding:



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

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

    现在让我们假设一个firefox实例已经启动并与该xserver通信。如果我们是启动的第二个firefox进程,我们可能会从根目录中找到第一个进程。我们可以通过firefox在其窗口上设置的窗口来识别属于firefox的窗口。一旦我们发现一个属于firefox的窗口,我们可能会请求拥有该窗口的进程添加一个新选项卡

    也许,如果我们找到这样一个过程,并要求它打开一个新的标签,我们只是死了,因为我们的工作已经完成

    当然,我们总是可以发现firefox确实做到了这一点。特别是:

    • 然后
    但他们不会用客户端消息通知它。它们通过更改窗口属性来实现。可能创建窗口的过程也订阅了属性更改通知。如果您好奇,代码的完整路径是:

    • 通过解析命令行
    • 然后调用
      SendCommandLine()
    • 这是一个虚拟函数,所以找到它的覆盖
    • 在这里,您可以看到它在哪里调用前两个函数,这两个函数链接到
      FindBestWindow()
      ,然后是
      DoSendCommandLine()