我有一个关于 ssh X 转发的问题。特别是当涉及转发 X 程序时,即某些 Web 浏览器客户端,例如 Iceweasel。
X Server <--(在X客户端上执行的显示Iceweasel的请求)--- X客户端
假设我想在这个 Web 浏览器中执行一些动态内容,例如 Flash 或 Javascript 游戏。
我的问题:它会在X服务器上执行还是在X客户端上执行?
答案1
因此,由于术语的原因,这是一个令人困惑的问题。 X 服务器是与计算机视频硬件交互的进程,并为 X 客户端提供通过 X 协议显示图形的能力。因此,当您通过带有 X 转发的 SSH 连接时,X 客户端位于远程服务器上,而 X 服务器是本地计算机上的进程。
在这种情况下,由于iceweasel在远程服务器上运行(作为X客户端运行),因此flash在远程服务器上执行,但它是通过SSH隧道使用X协议与本地计算机上的X服务器通信。
答案2
X 服务器仅处理显示和键盘/鼠标输入。它不会执行任意代码(这就是 ssh 的用途)。因此,如果您启动 Web 浏览器,flash 和 javascript 将在同一台计算机上执行。浏览器窗口将显示在运行 X 服务器的任何计算机上。对于 X 转发,这通常意味着具有 ssh 服务器的计算机正在运行代码,并且 ssh 客户端正在运行 X 服务器。
答案3
为了将这些事情牢记在心,我始终牢记两个方面。
- 有一个软件需要驱动我本地计算机上的图形显示。 (即与我的视频卡对话并在我的显示器上形成形状等)。
- 有一些可用的应用程序(例如终端或 Iceweasel)正在运行,需要显示自身。
所以对于X来说一切都是倒退的。服务器是您,客户端(例如 Iceweasel 等应用程序)正在尝试连接到您的 X 服务器。因此,流经 ssh 转发隧道的唯一数据是与 X 客户端与 X 服务器通信相关的数据。与 X 客户端相关的任何内容(Flash、Javascript 等)仍在 X 客户端上运行。
X Server X Client .-,( ),-.
__ _ (Iceweasel) .-( )-.
[__]|=| <------------ __ _ <-------- ( internet )
/::/|_| ssh [__]|=| '-( ).-'
tunnel /::/|_| '-.( ).-'
^ .-----------.
\ X Client #2
\ __ _
[__X Client #3
/:: __ _
[__]|=|
/::/|_|
答案4
闪存还将在 SSH 服务器(即 X 客户端)上执行,而不是在 SSH 客户端(即 X 服务器)上执行。 SSH 转发仅发送“输出”,基本上就是您在 SSH 客户端上看到的内容,但它是在服务器上执行的。
这也意味着您不需要在SSH客户端上安装浏览器或flash,安装在SSH服务器上就足够了。