有件事一直困扰着我,我一直无法找到以下方面的好信息:
你怎么或者为什么不能通过 SSH ( ssh -X
) 转发整个桌面?
我非常熟悉使用 转发单个窗口ssh -X
。但有时我想使用我的 Linux 笔记本电脑作为另一台 Linux 机器的哑终端。
我一直认为应该可以关闭笔记本电脑上的桌面环境,然后从命令行 ssh 进入另一台计算机并启动转发到我的笔记本电脑的桌面环境。
在线搜索会提供一堆第三方工具,例如 VNC 和 Xephyr,或者提供单窗口 ssh 命令和配置。但这不是我要找的。我希望了解一些解剖结构(xwindows?,wayland?,gdm?),以了解您将如何做到这一点,或者为什么这是不可能的。
笔记:
- Xephyr 不是我正在寻找的,因为它尝试在窗口中运行远程桌面
- 由于多种原因,VNC 不是我所寻找的,尤其是因为它不是 X11 转发,而是转发位图。
答案1
如何你可以吗?
我一直在使用Xmodulo 站点(现已暂停)中的以下方法从任何 Ubuntu 计算机远程访问我的整个 Raspberry Pi 桌面。适用于我原来的 RPi、RPi2 和 RPi3。当然,你必须修改 sshd_config 以允许在远程计算机上进行 X11 转发(我会说客户端/主机,但我相信它们在 X11 中与其他用途不同,我可能会让自己感到困惑)。注意空格——当我无法打字时,它们经常会破坏这个过程。
然后,您就拥有了整个桌面,并且可以像物理连接一样运行计算机。我使用CTRL+ ALT+切换到 Ubuntu ,然后使用+ +F7返回到 RPi 。 YMMV。一个怪癖:来回切换时,您必须在按下另一个功能键之前物理释放+ 。CTRLALTF2CTRLALT
原文链接: http://xmodulo.com/2013/12/remote-control-raspberry-pi.html
原创作品作者:Kristophorus Hadiono。遗憾的是,引用的图片已丢失。
更新(20230411):看起来该网站已备份。
方法 #3:通过 SSH 进行桌面的 X11 转发
通过 X11+SSH 转发,您实际上可以远程运行 Raspberry Pi 的整个桌面,而不仅仅是独立的 GUI 应用程序。
这里我将展示如何通过X11转发在第二个虚拟终端(即虚拟终端8)中运行远程RPi桌面。默认情况下,您的 Linux 桌面在第一个虚拟终端上运行,即虚拟终端 #7。按照以下说明操作,让您的 RPi 桌面显示在第二个虚拟终端中。
打开您的控制台或终端,然后更改为 root 用户。
sudo su
键入以下命令,这将在虚拟终端 8 中激活 xinit。注意,您将自动切换到虚拟终端 8。您可以通过按CTRL+ ALT+切换回原来的虚拟终端 7 F7。
xinit -- :1 &
切换到虚拟终端8后,执行以下命令远程启动RPi桌面。当询问时输入 pi 用户密码(见下图)。
DISPLAY=:1 ssh -X [email protected] lxsession
您将把远程 RPi 桌面以及从活动虚拟终端 7 启动的小型终端带到新的虚拟终端 8(见下图)。
记住,不要关闭该终端。否则,您的 RPi 桌面将立即关闭。
您可以通过按CTRL+ ALT+F7或CTRL+ ALT+在第一和第二个虚拟终端之间移动F8。
要通过 X11+SSH 关闭远程 RPi 桌面,您可以关闭活动虚拟终端 8 中看到的小终端(见上图),或者终止虚拟终端 7 中运行的 su 会话。
答案2
我还没有对此进行测试,但据我所知,应该可以关闭本地 X11 服务器(通常通过停止 X11 显示管理器,无论是gdm
、sddm
、 classicxdm
还是任何其他*dm
),然后登录到虚拟控制台并启动自定义 X11 会话,对于 GNOME 如下所示:
xinit ssh -X user@remote-server gnome-session
或者对于 KDE 来说是这样的:
xinit ssh -X user@remote-server startkde
通常,X11 显示管理器将启动 X11 服务器,显示登录对话框并处理身份验证(可以选择在身份验证之前和/或之后以 root 身份运行一些初始化脚本),然后以登录用户身份运行单个命令或脚本这将成为会议的支柱。该脚本的经典默认版本可能为/etc/X11/Xsession
,但 Gnome 和 KDE 等桌面环境可能会用自己的命令替换它。此命令/脚本将在会话的生命周期中保持活动状态:如果它因任何原因终止,X11 显示管理器将假定会话已注销或崩溃,并将重置 X11 服务器并重新开始。
当您在startx
没有 X11 显示管理器的情况下从虚拟控制台启动单个 X11 会话时,它是一个包装脚本,用于xinit
启动 X11 服务器和会话命令/脚本。
你想要做的是启动X11服务器,但是使用ssh -X
代替本地会话命令来运行实际的远程主机中的 X11 会话命令/脚本。
该xinit
命令将启动本地 X11 服务器,但它的唯一客户端将是该ssh
命令。这ssh
将建立 X11 转发、连接到远程主机、登录并运行在远程主机上启动适当的桌面环境会话所需的任何命令。由于$DISPLAY
变量和~/.Xauthority
文件将由 设置ssh -X
,因此任何 X11 应用程序(包括 X11 窗口管理器)都应该能够运行。
然而,由于X11服务器将无法在本地访问,各种提高性能的X11协议扩展将自动不可用,并且网络连接+SSH加密将导致一些明显的延迟。窗口管理器和任何其他 X11 应用程序之间的任何交互都必须通过 X11 服务器,这意味着每路都要经过两次网络。所以肯定会比运行本地桌面更慢。
某些桌面小部件也可能会感到困惑,因为在远程运行时,您不一定具有对主机的硬件设备和/或系统 D-Bus 的所有预期访问级别。
答案3
我可以做(我认为!)你想用 Lubuntu/LXDE 做的事情 - 我可以使用登录到远程 Lubuntu 机器ssh -Y
,以及本地运行的 X 服务器(例如 Mac 上的 Quartz,或者 Windows 上的 Xming 或 vcxsrv),运行lxsession
,并获得本地运行的 LXDE 任务栏。它似乎可以拾取并管理其他 X 窗口,包括本地运行的窗口!大多数 X 服务器都可以选择在客户端操作系统中作为单独的浮动 X 窗口运行,或者在可以全屏运行的背景下运行。请参阅此屏幕截图,其中lxsession
(我认为任务栏本身称为lxpanel
、几个本地 xterm、通过 ssh 登录并启动的 Mac iTerm 会话lxsession
、一个远程lxterm
和远程xeyes
.
其他发行版将需要不同的命令来运行桌面,例如对于 Ubuntu 或带有 GNOME 的 Mint,我认为是gnome-session
,尽管我无法让它在我的其他机器上工作。
答案4
我认为你需要读一点书。你可能会觉得奇怪,X 将键盘和鼠标描述为服务器,而巧妙的事情发生的地方描述为客户端 - 但这确实有道理(客户端发起到服务器的连接),这个概念可能是基础您对如何达到预期结果的困惑。
有多种方法可以实现您的目标。一些评论员建议使用 ssh 连接运行 xinit。 drkvogel 建议通过 ssh 调用单个程序 - 但是当该程序能够启动其他程序时,它会提供您所描述的有效功能,而不会切断您与本地计算机的连接。
但即使在 Linux 出现之前,人们就在 X 终端上运行 X 应用程序,这些终端确实是真正的终端——无法在本地运行任何应用程序。用于配置此类设备的协议称为 XDMCP。快速谷歌,我发现这它描述了如何配置显示管理器 - 这是提供初始登录功能的 X 客户端。那篇文章只提到在服务器上使用 xnest(带有屏幕和键盘的东西),但也可以专门使用完整的显示来进行远程会话
X -query client.host.net
其中“X”是 xinit 运行的第一个东西,而 client.host.net 是 X 客户端将运行的位置,并且应该托管修改后的显示管理器。
请注意,网络传输相当不安全 - 如果您想通过不受信任的网络进行连接,请考虑使用 VPN。
请注意,X 不提供任何音频功能 - 仅提供视频/键盘和鼠标。如果这很重要,请看看香料。
更新一些更勤奋的谷歌搜索发现了这个:https://tldp.org/HOWTO/XDM-Xterm/index.html