问题描述
在大多数场景中,我们搭建 VNC 服务,然后远程登录,输入密码,在登录成功后,将显示新会话(新桌面、新登录)。
但是,我们希望连接 VNC 服务后,可以显示当前会话(当前桌面、已经登录桌面),而不是在连接成功后显示新桌面。
该笔记将记录:在 Linux Desktop 中,如何共享当前桌面,以及常见问题处理。
解决方案
如果想实现「在连接 VNC 服务时,显示已经存在的会话」功能,关键是找到正确的软件。这里有两个解决方案,属于同类型:
1)使用 TigerVNC 的 x0vncserver 服务。它也实现相同功能;
2)使用 x11vnc 来搭建 VNC 服务。它将附加到正在运行的会话,共享桌面;
方法一、使用 TigerVNC/x0vncserver 服务(推荐)
系统环境:Debian GNU/Linux 10 (buster)
第一步、安装服务
apt-get install -y tigervnc-scraping-server
第二步、运行服务
如果希望使用独立的帐号密码来登录 VNC 桌面,以当前桌面用户执行如下命令:
# vncpasswd Password: Verify: Would you like to enter a view-only password (y/n)? n # x0vncserver -rfbauth "~/.vnc/passwd"
如果希望使用 Linux 系统的用户的帐号密码,执行如下命令
# /usr/bin/x0vncserver -PAMService=login -PlainUsers=$(whoami) -SecurityTypes=None
第三步、远程登录
使用 VNC 客户端进行登录即可,这里不再赘述。
关于开机自启动问题
我们还能够通过 XDG autostart 来实现子启动(推荐):
cat > ~/.config/autostart/x0vncserver.desktop <<EOF [Desktop Entry] Exec=sh -c '/usr/bin/x0vncserver -PAMService=login -PlainUsers=\$(whoami) -SecurityTypes=None' Name=x0vncserver Type=Application Version=1.0 EOF # 鉴于该文件仅会在用户登录时自动加载,因此当首次创建该文件后,我们需要手动启动。 cp ~/.config/autostart/x0vncserver.desktop ~/.local/share/applications/x0vncserver.desktop gtk-launch x0vncserver.desktop
我们能够通过 systemd 实现开机自启动:
mkdir -pv ~/.config/systemd/user/ cat > ~/.config/systemd/user/x0vncserver.service <<EOF [Unit] Description=Remote desktop service (VNC) [Service] Type=simple ExecStartPre=/bin/sh -c 'while ! pgrep -U "$USER" Xorg; do sleep 2; done' # 对于系统帐号密码,使用如下 ExecStart 指令: ExecStart=/usr/bin/x0vncserver -PAMService=login -PlainUsers=${USER} -SecurityTypes=None # 对于独立帐号密码,使用如下 ExecStart 指令: # ExecStart=/usr/bin/x0vncserver -rfbauth %h/.vnc/passwd [Install] WantedBy=default.target EOF systemctl start --user x0vncserver.service systemctl enable --user x0vncserver.service # 该方法的缺点在于 ExecStartPre 无法 100% 保证已经进入桌面 # 如果未进入桌面,则启动 x0vncserver 将失败。
方法二、使用 x11vnc 来搭建 VNC 服务
接下来开始搭建 x11vnc 服务,实验环境为 Debian GNU/Linux 10 (buster) 发行版。
第一步、安装软件
apt-get install x11vnc
第二步、运行服务
x11vnc -display $DISPLAY -usepw -listen <IP_of_interface> -autoport 5903 # -display : 要显示的屏幕。这里使用「$DISPLAY」获取当前显示器,通常为「:0」。 # -usepw : 使用用户密码进行认证。服务启动后会提示你输入密码。 # -listen : 要监听的IP地址。 # -autoport: 指定要监听的端口号。如果未指定,则会自动创建监听端口号,并在控制台输出监听的端口号。
如果要使用 xinetd 运行,可以参考 How to VNC to the primary display in ubuntu (display :0) 一文。
第三步、远程访问
使用 VNC 客户端进行连接即可,这里不再详细介绍。
附加说明
如果以 root 身份运行它以连接到 xdm 会话,则需要对 Xauth 进行一些研究,因为设置它可能有点繁琐。
常见问题汇总
Unable to connect to VNC Server using your chosen security setting
VNC Connect Error Messages – RealVNC Help Center
问题描述:在使用 REALVNC 连接 x0vncserver 服务时,REALVNC 客户端提示如下信息:
Unable to connect to VNC Server using your chosen security setting. Either upgrade VNC Server to a more recent version from RealVNC, or select a weaker level of encryption
问题原因:客户端不支持服务端设置的 SecurityTypes 类型
解决方法:设置双方都支持的安全类型,或者修改 x0vncserver 的 -SecurityTypes=None 以关闭
参考文献
Start vncserver on :0 instead of :1
How to VNC into an existing X session?
x11vnc: a VNC server for real X displays
tightvncserver – show the same screen on hdmi and vncclient
TigerVNC – ArchWiki