在 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 上的用户都可以与同一会话进行交互的解决方案也是相关的。
答案1
要控制正在运行的 X 会话,您需要将 VNC 服务器配置为连接到与 X 相同的显示器。通常,X 将连接到第一个显示器 - :0
。
您还需要该 X 会话的 X 权限。这可以通过访问远程显示管理器正在使用的 X Authority 文件来找到。这取决于您的显示管理器,可以使用ps aux
和找到grep
。例如:psaux | grep Xorg
给你类似的东西:
/usr/libexec/Xorg -background none :0 -seat seat0 -auth /var/run/lightdm/root/:0 -listen tcp vt1 -noswitch
请记下该-auth
选项,因为您需要使用 VNC 来使用它。root
安装后,您需要在远程计算机上运行如下所示的命令x11vnc
:
/usr/bin/x11vnc -norc -forever -shared -bg -autoport 5900 -auth /var/run/lightdm/root/:0
最简单的方法是创建一个在启动时为您运行此服务的服务。在使用 的发行版上,创建一个类似于以下内容的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
请注意该-rfbauth
选项。您需要事先使用以下命令创建密码文件:
$ sudo x11vnc -storepasswd /etc/x11vnc.pass
或者,如果您认为不需要密码保护的 VNC 会话,则只需删除该-rfbauth
行即可。
在启动时启用:
$ sudo systemctl enable x11vnc.service
手动启动它:
$ sudo systemctl start x11vnc.service
您现在可以使用 VNC 客户端连接到远程计算机并接管会话。