Skip to content

工具 - vnc远程桌面

安装tigervnc

sudo apt install tigervnc-standalone-server tigervnc-common

生成vnc远程桌面的密码

运行vncpasswd命令设置个人的vnc的控制访问密码.

系统将提示您输入并确认密码,以及是否将其设置为仅供查看的密码。Would you like to enter a view-only password (y/n)?n。

如果您选择设置仅查看密码,则用户使用view-only的密码来访问VNC时,将无法使用鼠标和键盘与VNC实例进行交互。这个在教学演示的场景使用到。

xstartup文件

可以自行增加编辑~/.vnc/xstartup脚本文件改变vnc的默认启动行为。如果xstartup文件不存在时,vnc会默认执行/etc/X11/Xtigervnc-session,所以xstartup文件并不是必需的。没有特殊需求,可以忽略本步骤。

  • 启动xface桌面的xstartup脚本写法
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
exec startxfce4
  • 启动gnome桌面的xstartup脚本写法
#!/bin/sh

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
vncconfig -iconic &
export DESKTOP_SESSION=/usr/share/xsessions/ubuntu.desktop
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
export GNOME_SHELL_SESSION_MODE=ubuntu
export XDG_DATA_DIRS=/usr/share/ubuntu:/usr/local/share/:/usr/share/:/var/lib/snapd/desktop
dbus-launch --exit-with-session /usr/bin/gnome-session --systemd --session=ubuntu

自定义配置

tigervnc的配置分为全局的和用户级的,如果不需要特殊配置,也可以忽略本步骤。

  • tigervnc会首选加载在/etc/tigervnc/vncserver-config-defaults的默认的公共配置;
  • 当上面的默认配置文件被加载后,会去你的家目录下找~/.vnc/tigervnc.conf配置,如果存在会优先使用你的个人配置;
  • 最后, /etc/tigervnc/vncserver-config-mandatory强制配置文件是最高优选级,如果存在会覆盖现有的配置。

::: tip 提示

详细的配置说明可以运行man tigervnc.conf查看

:::

除了可以通过xstartup文件来切换桌面环境外,也可以通过tigervnc.conf配置来切换环境

可以在~/.vnc/tigervnc.conf修改session参数来切换vnc桌面,session参数的默认值为gnome,可以将session值修改成xfce来切换桌面。注意修改的值,需要前提在/usr/share/xsessions目录中存在。

# vi ~/.vnc/tigervnc.conf             
$session = xfce;

启动vncserver

tigervnc在安装完后,已经创建了systenctl自启动服务/lib/systemd/system/tigervncserver@.service的模板,每个用户都可以借助这个模板创建属于自己的自启动服务。

# The tigervncserver service unit file
#
# Quick HowTo:
# 1. Add a user mapping to /etc/tigervnc/vncserver.users.
# 2. Adjust the global or user configuration. See the
#    tigervncsession(8) manpage for details. (OPTIONAL)
# 3. Run `systemctl enable tigervncserver@:<display>.service`
# 4. Run `systemctl start tigervncserver@:<display>.service`
#
# DO NOT RUN THIS SERVICE if your local area network is
# untrusted!  For a secure way of using VNC, you should
# limit connections to the local host and then tunnel from
# the machine you want to view VNC on (host A) to the machine
# whose VNC output you want to view (host B)
#
# [user@hostA ~]$ ssh -v -C -L 590N:localhost:590M hostB
#
# this will open a connection on port 590N of your hostA to hostB's port 590M
# (in fact, it ssh-connects to hostB and then connects to localhost (on hostB).
# See the ssh man page for details on port forwarding)
#
# You can then point a VNC client on hostA at vncdisplay N of localhost and with
# the help of ssh, you end up seeing what hostB makes available on port 590M
#
# Use "nolisten=tcp" to prevent X connections to your VNC server via TCP.
#
# Use "localhost" to prevent remote VNC clients connecting except when
# doing so through a secure tunnel.  See the "-via" option in the
# `man vncviewer' manual page.


[Unit]
Description=Remote desktop service (VNC)
After=network.target

[Service]
Type=forking
ExecStart=/usr/libexec/tigervncsession-start %i
Restart=on-success
PIDFile=/run/tigervncsession-%i.pid
SELinuxContext=system_u:system_r:vnc_session_t:s0

[Install]
WantedBy=multi-user.target
  • 按照上面的提示,编辑/etc/tigervnc/vncserver.users,添加用户到<display>的映射,如果上面没有你用户的映射,请自行添加. 并记住你的<display>编号. 比如hfs用户的编号为2,注意,下面的例子以2为例子,请替换成你自己用户的数字;
# TigerVNC User assignment
#
# This file assigns users to specific VNC display numbers.
# The syntax is <display>=<username>. E.g.:
#
# :2=andrew
# :3=lisa
:1=yancy
:2=hfs
:3=hzlarm
:4=liuhong
:5=jiacheng
:6=liusheng
:7=jacky
  • 运行systemctl enable tigervncserver@:display.service使能service,注意需要将display替换成用户对应的session序号,这里以hfs用户为例,下面的例子以2为例子,请替换成你自己用户的数字
sudo systemctl enable tigervncserver@:2.service
  • 运行systemctl start tigervncserver@:display.service开启service
sudo systemctl start tigervncserver@:2.service
  • 查看vnc是否开启成功

  • systemctl status xx

    hfs@Yancy:~$ sudo systemctl status tigervncserver@:2.service
       tigervncserver@:2.service - Remote desktop service (VNC)
          Loaded: loaded (/lib/systemd/system/tigervncserver@.service; enabled; vendor preset: enabled)
          Active: active (running) since Wed 2023-02-01 14:41:59 CST; 4s ago
          Process: 489086 ExecStart=/usr/libexec/tigervncsession-start :2 (code=exited, status=0/SUCCESS)
        Main PID: 489105 (tigervncsession)
            Tasks: 0 (limit: 18916)
          Memory: 692.0K
              CPU: 16ms
          CGroup: /system.slice/system-tigervncserver.slice/tigervncserver@:2.service
                   489105 /usr/sbin/tigervncsession hfs :2
    
      2月 01 14:41:59 Yancy systemd[1]: Starting Remote desktop service (VNC)...
      2月 01 14:41:59 Yancy tigervncsession[489105]: pam_unix(tigervnc:session): session opened for user hfs(uid=1006) by (uid=0)
      2月 01 14:41:59 Yancy systemd[1]: Started Remote desktop service (VNC).
    
    - 运行vncserver查看vnc端口,如果没有显示端口,说明开启失败

     hfs@Yancy:~$ vncserver -list
       TigerVNC server sessions:
    
       X DISPLAY #     RFB PORT #      RFB UNIX PATH   PROCESS ID #    SERVER
       2               5902                            489223          Xtigervnc
    

    记住上面端口5902,后面使用VNC客户端连接时,需要用到

VNC客户端

  • 如果还没有VNC viewer软件,需要下载VNC viewr,这里选择 RealVNC viewer作为例子,你可以选择其他你喜欢的,但是注意不要在公司网络内使用盗版和破解软件。
  • 创建连接,填入地址和端口号,记住上面步骤你开启的了端口号

  • 切换到options界面,把图片质量设置成高,否则画面质量有可能很差

  • 点击ok确认就可以连接上VNC桌面

SSH隧道

::: tip 注意

由于VNC的默认连接是纯TCP的,并没有加密,可以通过SSH创建隧道来加密连接,如果是在内网环境,可以忽略。

:::

  • tabby的ssh连接配置中,找到PORTS选项卡,如下图所示,添加一个Local类型的端口转发。

  • 这样连接vnc时,目标地址填本地的就行。

  • 最终加了ssh隧道的效果如下图所示。

  • 更多关于ssh隧道的细节请跳转至ssh隧道