如何在Linux上实现MS远程桌面的效果?

ein*_*lum 5 xorg remote remote-desktop freerdp

在 Windows 机器上,如果一台机器 A 运行远程桌面服务,而另一台机器 B(实际上不一定是 Windows)运行远程桌面客户端 - 那么 B 上的用户可以“窃取”会话的控制权A,查看在那里打开的应用程序窗口并与之交互。请注意,如果没有现有会话,RDP 还允许您打开一个新会话,但这不是问题所在。

我的问题:我怎样才能在 A 是一台 Linux 机器的情况下实现同样的目标,运行一个 X 服务器,并且正在进行 X 会话。

笔记:

  • 解决方案不必基于 MSRDP 本身,它可以是 NX、VNC 或其他任何您喜欢的。
  • 我愿意在 A 和 B 上安装软件,包括以 root 用户身份安装。
  • 商业解决方案是相关的,尽管我不想诉诸它们。
  • 解决方案可能涉及在 A 上打开其他端口(除了用于 SSH 的端口 22)。
  • 假设发行版是基于 Debian 的并且是最近的。
  • 这个问题类似于这一个,但它是不一样的,因为:1。我愿意跑的比刚才X和2.在该问题的其他业务,OP似乎更感兴趣的是得到特定的窗口,而对我来说这重要的是看到整个事情。
  • A 和 B 上的用户都可以与同一会话进行交互的解决方案也是相关的。

gar*_*Red 6

要控制正在运行的 X 会话,您需要将 VNC 服务器配置为连接到与 X 相同的显示器。通常,X 将连接到第一个显示器 - :0

您还需要该 X 会话的 X 权限。这可以通过访问远程显示管理器正在使用的 X 权限文件找到。这取决于您的显示管理器,可以使用ps aux和找到grep。例如:psaux | grep Xorg给你类似的东西:

/usr/libexec/Xorg -background none :0 -seat seat0 -auth /var/run/lightdm/root/:0 -listen tcp vt1 -noswitch
Run Code Online (Sandbox Code Playgroud)

请注意该-auth选项,因为 VNC 需要它。安装后,您需要root在远程计算机上运行类似以下内容x11vnc

/usr/bin/x11vnc -norc -forever -shared -bg -autoport 5900 -auth /var/run/lightdm/root/:0
Run Code Online (Sandbox Code Playgroud)

最简单的方法是创建一个在启动时为您运行的服务。在使用 的发行版上systemd,创建一个/etc/systemd/system/x11vnc.service类似于以下内容的文件:

[Unit]
Description=VNC Server for X11
Requires=display-manager.service
After=display-manager.service

[Service]
Type=forking
ExecStart=/usr/bin/x11vnc -norc -forever -shared -bg \
        -autoport 5900 \
        -rfbauth /etc/x11vnc.pass \
        -o /var/log/x11vnc.log \
        -auth /var/run/lightdm/root/:0

[Install]
WantedBy=graphical.target
Run Code Online (Sandbox Code Playgroud)

请注意该-rfbauth选项。您需要事先使用以下方法创建密码文件:

$ sudo x11vnc -storepasswd /etc/x11vnc.pass
Run Code Online (Sandbox Code Playgroud)

或者,如果您觉得不需要受密码保护的 VNC 会话,则只需删除该-rfbauth行即可。

启动时启用:

$ sudo systemctl enable x11vnc.service
Run Code Online (Sandbox Code Playgroud)

手动启动它:

$ sudo systemctl start x11vnc.service
Run Code Online (Sandbox Code Playgroud)

您现在可以使用 VNC 客户端连接到远程计算机并接管会话。