VNC概述

VNC (Virtual Network Console)是虚拟网络控制台的缩写。VNC 是一款优秀的远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发的。VNC 是在基于 UNIX 和 Linux操作系统的免费的开源软件,远程控制能力强大,高效实用,其性能可以和 Windows 或 MAC中的任何远程控制软件媲美。在 Linux 中,VNC 包括以下四个命令:vncserver,vncviewer,vncpasswd,和 vncconnect。大多数情况下只需要其中的两个命令:vncserver 和 vncviewer。目前,原来的AT&T版本已经不再使用,因为更多有重大改善的分支版本已经出现, 像是RealVNC, VNC tight 和UltraVNC。 Real VNC 是当前最活跃和强大的主流应用。

VNC 服务是一个远程显示守护进程,它向用户提供一些远程功能,包括:
1、直接控制本地 X 会话;
2、在一台机器上的后台并行 X 会话,即并不显示在物理显示器上而是虚拟显示器。即使用户断开连接,在服务器上运行的所有程序依旧可以运行。

VNC默认使用TCP端口5900至5906,而JAVA的VNC客户端使用5800至5806。一个服务端可以在5500口用“监听模式”连接一个客户端,使用监听模式的一个好处是服务端不需要设置防火墙。

在Debian9.5 上开启VNC我尝试了 vnc4server,tigervnc-standalone-server(TigerVNC最初基于TightVNC的(从未发布的)VNC 4分支 ),这两个VNC软件
都不好用,可能是运行vncsearer命令不能生成~/.vnc/xstartup文件的原因,最后选择了tightVNC 这个软件可以实现。我的图形桌面环境是xfce4如果没有安装图形桌面环境的需要安装。

一、安装tightvnc软件:
root@debian:~# apt install tightvncserver

root@debian:~# apt install tightvnc-java

被连接的服务器需要安装tightvncserver,如果需要通过浏览器java访问需要安装tightvnc-java
二、启动VNC服务
使用vncserver命令启动VNC服务,命令格式为“vncserver :桌面号”,其中“桌面号”用“数字”的方式表示,每个用户连接需要占用1个桌面
,启动编号为1的桌面示例如下,如果不指定桌面号(:n)会从最小没用的桌面号启用。

==========================================================================
laopi@debian:~$ vncserver :1

You will require a password to access your desktops.

Password:                                                  #输入远程访问密码
Warning: password truncated to the length of 8.
Verify:                                                        #重复输入远程访问密码
Would you like to enter a view-only password (y/n)? n      #是否输入一个只能查看的密码,选择否
 
Warning: debian:1 is taken because of /tmp/.X1-lock
Remove this file if there is no X server debian:1

New 'X' desktop is debian:2

Creating default startup script /home/laopi/.vnc/xstartup
Starting applications specified in /home/laopi/.vnc/xstartup
Log file is /home/laopi/.vnc/debian:2.log

laopi@debian:~$
============================================================================
如果在Root用户下执行 vncserver :1命令,这样会让普通用户登录时候输入用户名和密码,屏幕黑了一下,然后又返回了输入用户名密码的界面,因为普通用户主目录下的.Xauthority(~/.Xauthority)文件的所属组和所有者都改成了root ,只有把这个文件改回为普通用户所有者和所属组,普通用户才能正常登录。

命令执行的过程中,是在laopi这个用户提示符下执行同时也是第一次执行,会在此用户的主目录(~/)下生成.vnc子目录和相应的配置文件,同时需要输入密码(vncviewer端用此用户访问的密码),这个密码被加密保存在此用户主目录下的.vnc子目录(~/.vnc/passwd)中;同时在用户主目录下的.vnc子目录中为用户自动建立xstartup配置文件(~/.vnc/xstartup),在每次启动VND服务时,都会读取该文件中的配置信息。上面的是添加laopi这个用户通过VNC访问权限,如果想添加其他用户访问权限,需要在相应的用户命令提示符下进行上面的操作(如test用户也需要执行[test@ localhost ~]$ vncserver :1   在相应的主目录下生成对应的.vnc子目录)。对不同用户的访问密码更改也需要在相应的命令提示符下操作。
在~/.vnc/目录下还有一个“debian:1.pid”文件,这个文件记录着启动VNC后对应操作系统的进程号,用于停止VNC服务时准确定位进程号,也可以在这个目录下查看已经启动的桌面号,如:debian:n.pid (n代表桌面号)

VNC服务运行的默认端口是 :1 ,它代表服务运行的TCP端口(5900+n = 端口号)。在此例中,它运行在 5900+1=5901 。再次执行VNC服务会创建另一个实例,并运行在下一个更高的空闲端口上,例如 :2 或说 5902。

3.VNC服务使用的端口号与桌面号的关系
VNC服务使用的端口号与桌面号相关,VNC使用TCP端口从5900开始,对应关系如下
桌面号为“1”  ---- 端口号为5901
桌面号为“2”  ---- 端口号为5902
桌面号为“3”  ---- 端口号为5903
……
基于Java的VNC客户程序Web服务TCP端口从5800开始,也是与桌面号相关,对应关系如下
桌面号为“1”  ---- 端口号为5801
桌面号为“2”  ---- 端口号为5802
桌面号为“3”  ---- 端口号为5803
……
基于上面的介绍,如果Linux开启了防火墙功能,就需要手工开启相应的端口,以开启桌面号为“1”相应的端口为例,命令如下

=========================================================================
[root@ localhost ~]# iptables -I INPUT -p tcp --dport 5901 -j ACCEPT
[root@ localhost ~]# iptables -I INPUT -p tcp --dport 5801 -j ACCEPT

==========================================================================

注意: 在物理内存允许的条件下,Linux系统可以拥有任意数量的VNC服务——它们互相并行。
使用 -kill 开关来关闭VNC服务:

laopi@debian:~$ vncserver -kill :1

三、编辑 xstartup 文件
VNC 服务读取 ~/.vnc/xstartup 文件(功能类似于 .xinitrc)。如果需要图形环境,则用户至少需要定义一个桌面环境来启动。例如:启动xfce4

1、在修改xstartup文件之前,请备份原始文件:
laopi@debian:~$ mv -v .vnc/xstartup .vnc/xstartup.backup

2、使用 -kill 开关来关闭第一次启动的VNC服务
laopi@debian:~$ vncserver -kill :1

3、编辑~/.vnc/xstartup内容如下,用自动生产的文件远程时候会灰屏,没有图形界面。
============================================
#!/bin/sh
unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS
exec startxfce4

============================================

4、确保该文件有可执行权限:

laopi@debian:~$ chmod u+x ~/.vnc/xstartup

5、权限像对待 ~/.ssh 一样保护 ~/.vnc 是很好的做法,虽然并非必须。执行下面的命令来达到该目的:

laopi@debian:~$ chmod 700 ~/.vnc

四、测试VNC服务
第一种方法是使用VNC Viewer软件登陆测试,操作流程如下
启动VNC Viewer软件 --> Server输入“192.168.1.100:1” --> 点击“OK” --> Password输入登陆密码 --> 点击“OK”登陆到X-Window图形桌面环境 --> 测试成功
第二种方法是使用Web浏览器(如Firefox,IE,Safari)登陆测试,操作流程如下
地址栏输入192.168.1.100:1:5801/ --> 出现VNC viewer for Java(此工具是使用Java编写的VNC客户端程序)界面,同时跳出VNC viewer对话框,在Server处输入“144.194.192.183:1”点击“OK” --> Password输入登陆密码 --> 点击“OK”登陆到X-Window图形桌面环境 --> 测试成功
(注:VNC viewer for Java需要JRE支持,如果页面无法显示,表示没有安装JRE,可以到http://java.sun.com/javase/downloads/index_jdk5.jsp这里下载最新的JRE进行安装)
五、修改VNC访问的密码
使用命令vncpasswd对不同用户的VNC的密码进行修改,一定要注意,如果配置了不同用户的VNC需要分别到各自用户中进行修改,例如在我的这个实验中,laopi用户需要修改,修改过程如下:

==========================================================================
laopi@debian:~$ vncpasswd
Password:                                             #输入密码
Verify:                                                   #确认密码
laopi@debian:~$

===========================================================================

六、让TightVNC随系统开机通过systemd自动启动

1、首先,创建一个新的名为单元文件/etc/systemd/system/vncserver@.service

root@debian:~# vi /etc/systemd/system/vncserver@.service

2、将以下内容复制并粘贴到其中保持。 一定要将选项User=laopi的用户名改为用于登录的用户名(我的普通用户名为laopi)。最好用普通用户

=====================================================================
[Unit]
Description=Start TightVNC server at startup
After=syslog.target network.target

[Service]
Type=simple
User=laopi
PAMName=login
PIDFile=/home/%u/.vnc/%H%i.pid
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1024x768 %i

[Install]
WantedBy=multi-user.target
=====================================================================

3、接下来,让系统知道新的单元文件。

root@debian:~# systemctl daemon-reload

4、启用单元文件。

root@debian:~# systemctl enable vncserver@:1.service

这个命令启用桌面号为:1 你可以启用:2,:3或:n只要把:1改成对应的,通过这个命令也使得系统开机直接启用相应的桌面

下面的命令只有第一次启用VNC时候用到,配置好了 以后启动机器不需要在执行了
5、停止VNC服务器的当前实例(如果它仍在运行)。

laopi@debian:~$ vncserver -kill :1

6、然后启动它,因为您将启动任何其他systemd服务。

root@debian:~# systemctl start vncserver@:1.service

最新文章

  1. Python cumsums和cumprod函数
  2. Rest(表述性状态转移)
  3. 一个实现了View接口的Fragment
  4. 熟悉scss
  5. Java中hashCode的作用
  6. maven引入jar包时,一个jar的引入错误,会导致后来的jar包的引入。
  7. Vue中class与style绑定
  8. NLTK中的词性
  9. 当局部变量遇上全局变量——extern及花括号用法举例
  10. Unity3D问题之EnhanceScollView选择角色3D循环滚动效果实现
  11. 一个备份MySQL数据库的简单Shell脚本(转)
  12. mobile js
  13. Python如何调用新浪api接口的问题
  14. C# /VB.NET 创建PDF项目符号列表和多级编号列表
  15. zabbix3.4.7实操总结一
  16. blfs(systemd版本)学习笔记-构建ibus-libpinyin使用中文输入法
  17. Chrome 使用绿色版实现同一个机器 打开多个不同的chrome版本
  18. zjoi 2017 树状数组
  19. app和bootloader跳转 MSP与PSP
  20. 在 NHibernate 中一切必须是 Virtual 的吗?

热门文章

  1. centos7.x86_64搭建饥荒服务器
  2. spring 、Mybatis配置sql server数据库
  3. 物理读之LRU(近期最少被使用)的深入解析
  4. RvmTranslator7.1
  5. win7 一个电脑接入多个显示器
  6. CSRF的原理
  7. SecondaryNameNode合并元信息过程
  8. Android PullToRefreshListView和ViewPager的结合使用
  9. Bayes++ Library入门学习之熟悉class-Importance_resampler
  10. codeforces 445 B DZY Loves Chemistry【并查集】