通过 ssh 转发 x11 时后台会发生什么?
What happens in background when forwarding x11 through ssh?
当我在我的主机上安装 xServer 运行ning 然后我使用 ssh 连接到另一台机器时,我试图熟悉幕后实际发生的事情,就像这样:ssh -Y user@machine
。在这种情况下,我将在 Windows 上使用 cygwin,并将我的 DISPLAY
环境变量设置为 :0.0
,并且 运行 一个 GUI 应用程序一旦连接到远程机器,它会出现在我的主机上。 Mac 将在本地 xServer 中使用 Quartz(抱歉,如果这个术语不正确,但希望你明白我的意思)并且会使用 ssh -X user@machine
而不是 -Y
.
这里的目标是拥有一个 Docker 容器,它只负责安装和 运行 一个 GUI 应用程序。我会 运行 我主机上的 Docker 容器,GUI 会从目标主机上弹出。
我已经通过 ssh 完成了这项工作,并在容器中手动启动了一次 GUI 应用程序。我只需要知道如何配置这个 vanilla Linux 机器(Docker 容器)来转发 GUI。 我认为了解 ssh -Y
命令实际上在做什么以正确设置转发是我需要的缺失拼图。 我对 [=] 的存在有一个模糊的理解16=] 文件。我根本不关心连接的安全性。我会在它开始工作后担心它。
X 应用程序 <-> X 服务器
首先,X应用程序如何找到并连接到X服务器?
应用程序读取 DISPLAY
环境变量以了解如何连接到 X 服务器。例如值 :0
表示它应该连接到 /tmp/.X11-unix/X0
中的 unix 套接字,值 hostname:5
表示连接到计算机 hostname
.[=31 的 TCP 端口 6005
=]
X 服务器可以配置为从应用程序请求身份验证。通常,当 X 服务器作为用户会话的一部分启动时,cookie 存储在用户主目录的 .Xauthority
文件中,并且只能由用户读取。通过将 cookie 发送到 X 服务器,应用程序证明它具有读取用户文件的权限,因此也具有查看其显示的权限。 (文件可以在环境变量设置的不同路径中XAUTHORITY
。)
ssh 转发
当您使用 -X
或 -Y
参数连接到服务器时,ssh 将读取本地 X 服务器的身份验证 cookie,并将其发送到远程端的 ssh 服务器。
在远程端,ssh 将使用该 cookie 创建临时身份验证文件并将 XAUTHORITY
变量指向它。它将开始侦听某个本地端口(例如 6010
)并设置 DISPLAY
变量指向它(例如 localhost:10
)。如果您在该会话中启动任何图形应用程序,它将连接到 ssh(认为它是 X 服务器),它将通过隧道返回本地。
在本地,ssh 将任何隧道连接转发到本地 X 服务器。 (它使用 DISPLAY
变量找到的。)
-X
和 -Y
之间的区别:远程计算机上的恶意根可以从那里的 cookie 文件中读取 cookie,并使用它连接回您的 X 服务器。如果您使用 -X
ssh 使用 X 服务器的安全扩展来拒绝应用程序的某些功能(例如截屏或抓取键盘)。但是某些应用程序可能需要这些才能工作,因此如果您信任服务器,请使用 -Y
.
备选
顺便说一下,如果网络是完全可信的(比如你的机器和虚拟机之间的虚拟网络),你可以完全省略ssh。您可以设置 DISPLAY
变量,以便远程应用程序通过 TCP 连接到本地 X 服务器(Quartz)。您只需要在您的 Quartz 中启用 TCP 侦听并在两侧设置 cookie。这看起来像合理的教程:
http://oroborosx.sourceforge.net/remotex.html
当我在我的主机上安装 xServer 运行ning 然后我使用 ssh 连接到另一台机器时,我试图熟悉幕后实际发生的事情,就像这样:ssh -Y user@machine
。在这种情况下,我将在 Windows 上使用 cygwin,并将我的 DISPLAY
环境变量设置为 :0.0
,并且 运行 一个 GUI 应用程序一旦连接到远程机器,它会出现在我的主机上。 Mac 将在本地 xServer 中使用 Quartz(抱歉,如果这个术语不正确,但希望你明白我的意思)并且会使用 ssh -X user@machine
而不是 -Y
.
这里的目标是拥有一个 Docker 容器,它只负责安装和 运行 一个 GUI 应用程序。我会 运行 我主机上的 Docker 容器,GUI 会从目标主机上弹出。
我已经通过 ssh 完成了这项工作,并在容器中手动启动了一次 GUI 应用程序。我只需要知道如何配置这个 vanilla Linux 机器(Docker 容器)来转发 GUI。 我认为了解 ssh -Y
命令实际上在做什么以正确设置转发是我需要的缺失拼图。 我对 [=] 的存在有一个模糊的理解16=] 文件。我根本不关心连接的安全性。我会在它开始工作后担心它。
X 应用程序 <-> X 服务器
首先,X应用程序如何找到并连接到X服务器?
应用程序读取 DISPLAY
环境变量以了解如何连接到 X 服务器。例如值 :0
表示它应该连接到 /tmp/.X11-unix/X0
中的 unix 套接字,值 hostname:5
表示连接到计算机 hostname
.[=31 的 TCP 端口 6005
=]
X 服务器可以配置为从应用程序请求身份验证。通常,当 X 服务器作为用户会话的一部分启动时,cookie 存储在用户主目录的 .Xauthority
文件中,并且只能由用户读取。通过将 cookie 发送到 X 服务器,应用程序证明它具有读取用户文件的权限,因此也具有查看其显示的权限。 (文件可以在环境变量设置的不同路径中XAUTHORITY
。)
ssh 转发
当您使用 -X
或 -Y
参数连接到服务器时,ssh 将读取本地 X 服务器的身份验证 cookie,并将其发送到远程端的 ssh 服务器。
在远程端,ssh 将使用该 cookie 创建临时身份验证文件并将 XAUTHORITY
变量指向它。它将开始侦听某个本地端口(例如 6010
)并设置 DISPLAY
变量指向它(例如 localhost:10
)。如果您在该会话中启动任何图形应用程序,它将连接到 ssh(认为它是 X 服务器),它将通过隧道返回本地。
在本地,ssh 将任何隧道连接转发到本地 X 服务器。 (它使用 DISPLAY
变量找到的。)
-X
和 -Y
之间的区别:远程计算机上的恶意根可以从那里的 cookie 文件中读取 cookie,并使用它连接回您的 X 服务器。如果您使用 -X
ssh 使用 X 服务器的安全扩展来拒绝应用程序的某些功能(例如截屏或抓取键盘)。但是某些应用程序可能需要这些才能工作,因此如果您信任服务器,请使用 -Y
.
备选
顺便说一下,如果网络是完全可信的(比如你的机器和虚拟机之间的虚拟网络),你可以完全省略ssh。您可以设置 DISPLAY
变量,以便远程应用程序通过 TCP 连接到本地 X 服务器(Quartz)。您只需要在您的 Quartz 中启用 TCP 侦听并在两侧设置 cookie。这看起来像合理的教程:
http://oroborosx.sourceforge.net/remotex.html