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