zl程序教程

您现在的位置是:首页 >  其他

当前栏目

一键安装VNC脚本

安装 脚本 一键 vnc
2023-06-13 09:12:48 时间

在linux服务器上安装 VNC (Virtual Network Console),即虚拟网络控制台,它是一款基于 UNIX 和 Linux 操作系统的优秀远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发,远程控制能力强大,高效实用,并且免费开源。

# 执行脚本

[root@summer1 home]# bash install_vnc_server.sh

点击查看

#!/bin/bash
#########################################
#Function:    install vnc server
#Usage:       bash install_vnc_server.sh
#Author:      Customer service department
#Company:     Alibaba Cloud Computing
#Version:     3.0
#########################################

check_os_release()
{
  while true
  do
    os_release=$(grep "Red Hat Enterprise Linux Server release" /etc/issue 2>/dev/null)
    os_release_2=$(grep "Red Hat Enterprise Linux Server release" /etc/redhat-release 2>/dev/null)
    if [ "$os_release" ] && [ "$os_release_2" ]
    then
      if echo "$os_release"|grep "release 5" >/dev/null 2>&1
      then
        os_release=redhat5
        echo "$os_release"
      elif echo "$os_release"|grep "release 6" >/dev/null 2>&1
      then
        os_release=redhat6
        echo "$os_release"
      else
        os_release=""
        echo "$os_release"
      fi
      break
    fi
    os_release=$(grep "Aliyun Linux release" /etc/issue 2>/dev/null)
    os_release_2=$(grep "Aliyun Linux release" /etc/aliyun-release 2>/dev/null)
    if [ "$os_release" ] && [ "$os_release_2" ]
    then
      if echo "$os_release"|grep "release 5" >/dev/null 2>&1
      then
        os_release=aliyun5
        echo "$os_release"
      elif echo "$os_release"|grep "release 6" >/dev/null 2>&1
      then
        os_release=aliyun6
        echo "$os_release"
      elif echo "$os_release"|grep "release 7" >/dev/null 2>&1
      then
        os_release=aliyun7
        echo "$os_release"
      else
        os_release=""
        echo "$os_release"
      fi
      break
    fi
    os_release_2=$(grep "CentOS" /etc/*release 2>/dev/null)
    if [ "$os_release_2" ]
    then
      if echo "$os_release_2"|grep "release 5" >/dev/null 2>&1
      then
        os_release=centos5
        echo "$os_release"
      elif echo "$os_release_2"|grep "release 6" >/dev/null 2>&1
      then
        os_release=centos6
        echo "$os_release"
      elif echo "$os_release_2"|grep "release 7" >/dev/null 2>&1
      then
        os_release=centos7
        echo "$os_release"
      else
        os_release=""
        echo "$os_release"
      fi
      break
    fi
    os_release=$(grep -i "ubuntu" /etc/issue 2>/dev/null)
    os_release_2=$(grep -i "ubuntu" /etc/lsb-release 2>/dev/null)
    if [ "$os_release" ] && [ "$os_release_2" ]
    then
      if echo "$os_release"|grep "Ubuntu 10" >/dev/null 2>&1
      then
        os_release=ubuntu10
        echo "$os_release"
      elif echo "$os_release"|grep "Ubuntu 12.04" >/dev/null 2>&1
      then
        os_release=ubuntu1204
        echo "$os_release"
      elif echo "$os_release"|grep "Ubuntu 12.10" >/dev/null 2>&1
      then
        os_release=ubuntu1210
        echo "$os_release"
     elif echo "$os_release"|grep "Ubuntu 14.04" >/dev/null 2>&1
     then
        os_release=ubuntu1204
        echo "$os_release" 
      else
        os_release=""
        echo "$os_release"
      fi
      break
    fi
    os_release=$(grep -i "debian" /etc/issue 2>/dev/null)
    os_release_2=$(grep -i "debian" /proc/version 2>/dev/null)
    if [ "$os_release" ] && [ "$os_release_2" ]
    then
      if echo "$os_release"|grep "Linux 6" >/dev/null 2>&1
      then
        os_release=debian6
        echo "$os_release"
      elif echo "$os_release"|grep "Linux 7" >/dev/null 2>&1
      then
        os_release=debian7
        echo "$os_release"
      else
        os_release=""
        echo "$os_release"
      fi
      break
    fi
    break
    done
}

exit_script()
{
  echo -e "\033[1;40;31mInstall $1 error,will exit.\n\033[0m"
  rm -f $LOCKfile
  exit 1
}

update_source()
{
  wget "http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/41177/cn_zh/1504061676920/update_source.sh" -O update_source.tgz
  tar -zxvf update_source.tgz
  bash update_source.sh
}

rhel5_vnc_config()
{
cat >$vnc_xstartup_config<<EOF
#!/bin/sh

# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
# exec /etc/X11/xinit/xinitrc

[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r \$HOME/.Xresources ] && xrdb \$HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
xterm -geometry 80x24+10+10 -ls -title "\$VNCDESKTOP Desktop" &
#twm &
gnome-session &
EOF
cat >$vnc_sysconfig_vncservers<<EOF
# The VNCSERVERS variable is a list of display:user pairs.
#
# Uncomment the lines below to start a VNC server on display :2
# as my 'myusername' (adjust this to your own).  You will also
# need to set a VNC password; run 'man vncpasswd' to see how
# to do that.
#
# DO NOT RUN THIS SERVICE if your local area network is
# untrusted!  For a secure way of using VNC, see
# <URL:http://www.uk.research.att.com/archive/vnc/sshvnc.html>.

# Use "-nolisten tcp" to prevent X connections to your VNC server via TCP.

# Use "-nohttpd" to prevent web-based VNC clients connecting.

# 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.

# VNCSERVERS="2:myusername"
# VNCSERVERARGS[2]="-geometry 800x600 -nolisten tcp -nohttpd -localhost"
VNCSERVERS="1:root"
EOF
}

check_selinux_config()
{
  if grep "SELINUX=enforcing" $selinux_config >/dev/null 2>&1
  then
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/' $selinux_config
  fi
}

centos5_install_vnc_server()
{
  if [ "$1" == "redhat5" ]
  then
    if rpm -qa|grep redhat-logos >/dev/null 2>&1
    then
      yum remove $(rpm -qa|grep redhat-logos) -y
    fi
  fi
  if yum grouplist "GNOME Desktop Environment"|grep "Available" >/dev/null 2>&1
  then
    if ! yum groupinstall "GNOME Desktop Environment" -y
    then
      exit_script "GNOME Desktop Environment"
    fi
  fi
  if ! rpm -q vnc-server >/dev/null 2>&1
  then
    if ! yum install vnc-server -y
    then
      exit_script vnc-server
    fi
    vncserver <<EOF
$password
$password
EOF
  else
    vncpasswd <<EOF
$password
$password
EOF
  fi
  vncserver -kill :1
  service vncserver stop
  service pcscd stop
  chkconfig --del pcscd
  yum remove esc -y
  rhel5_vnc_config
  chmod 755 $vnc_xstartup_config
  chkconfig --level 345 vncserver on
  service NetworkManager stop
  chkconfig --del NetworkManager
  check_selinux_config
  sleep 20
  service vncserver start
}

centos6_install_vnc_server()
{
  if yum grouplist "X Window System"|grep "Available" >/dev/null 2>&1
  then
    if ! yum groupinstall "X Window System" -y
    then
      exit_script "X Window System"
    fi
  fi
  if yum grouplist "Desktop"|grep "Available" >/dev/null 2>&1
  then
    if ! yum groupinstall "Desktop" -y
    then
      exit_script Desktop
    fi
  fi
  if yum grouplist "Chinese Support"|grep "Available" >/dev/null 2>&1
  then
    if ! yum groupinstall "Chinese Support" -y
    then
      exit_script "Chinese Support"
    fi
  fi
  if ! rpm -q tigervnc-server >/dev/null 2>&1
  then
    if ! yum install tigervnc-server -y
    then
      exit_script tigervnc-server
    fi
    vncserver <<EOF
$password
$password
EOF
  else
    vncpasswd <<EOF
$password
$password
EOF
  fi
  vncserver -kill :1
  service vncserver stop
  service pcscd stop
  chkconfig --del pcscd
  yum remove esc -y
  sed -i 's/.*!= root.*/#&/' /etc/pam.d/gdm 
  dbus-uuidgen >/var/lib/dbus/machine-id
  rhel5_vnc_config
  chmod 755 $vnc_xstartup_config
  chkconfig --level 345 vncserver on
  service NetworkManager stop
  chkconfig --del NetworkManager
  sleep 20
  service vncserver start
  check_selinux_config
}

centos7_install_vnc_server()
{
  if ! yum groupinstall "GNOME Desktop" "Graphical Administration Tools" -y
  then
    exit_script "NOME Desktop Graphical Administration Tools"
  fi
  if ! yum install tigervnc-server -y
  then
    exit_script "tigervnc-server"
  fi
  cp /lib/systemd/system/vncserver@.service /lib/systemd/system/vncserver@\:1.service
  sed -i 's/%i/:1/g' /lib/systemd/system/vncserver@\:1.service
  sed -i 's/<USER>/root/g' /lib/systemd/system/vncserver@\:1.service
  sed -i 's/home\/root/root/g' /lib/systemd/system/vncserver@\:1.service
  vncpasswd <<EOF
$password
$password
EOF
  systemctl enable vncserver@:1.service
  systemctl start vncserver@:1.service
  systemctl status vncserver@:1.service
  systemctl disable initial-setup-text.service
}

ubuntu_install_vnc_server()
{
  if ! dpkg -s lxde >/dev/null 2>&1
  then
    if ! apt-get install lxde -y --force-yes --fix-missing
    then
      exit_script lxde
    fi
  fi
  if ! dpkg -s ttf-arphic-uming >/dev/null 2>&1
  then
    if ! apt-get install ttf-arphic-uming -y --force-yes --fix-missing
    then
      exit_script ttf-arphic-uming
    fi
  fi
  if ! dpkg -s vnc4server >/dev/null 2>&1
  then
    if ! apt-get install vnc4server -y --force-yes --fix-missing
    then
      exit_script vnc4server
    fi
    vncserver <<EOF
$password
$password
EOF
  else
    vncpasswd <<EOF
$password
$password
EOF
  fi
  vncserver -kill :1
  sed -i 's/x-window-manager \&/startlxde \&/' $vnc_xstartup_config
  sed -i '/vncserver/d' $rc_local
  sed -i 's/^exit 0$/su root \-c "\/usr\/bin\/vncserver \-name my-vnc-server \-geometry 1280x800 \:1"\nexit 0/' $rc_local
  sleep 5
  vncserver
}


####################Start###################
#check lock file ,one time only let the script run one time 
LOCKfile=/tmp/.$(basename $0)
if [ -f "$LOCKfile" ]
then
  echo -e "\033[1;40;31mThe script is already exist,please next time to run this script.\n\033[0m"
  exit
else
  echo -e "\033[40;32mStep 1.No lock file,begin to create lock file and continue.\n\033[40;37m"
  touch $LOCKfile
fi

#check user
if [ $(id -u) != "0" ]
then
  echo -e "\033[1;40;31mError: You must be root to run this script, please use root to install this script.\n\033[0m"
  rm -f $LOCKfile
  exit 1
fi

vnc_xstartup_config=/root/.vnc/xstartup
vnc_sysconfig_vncservers=/etc/sysconfig/vncservers
selinux_config=/etc/selinux/config
rc_local=/etc/rc.local
password=$(cat /dev/urandom | head -1 | md5sum | head -c 6)

echo -e "\033[40;32mStep 2.Begen to check the OS issue.\n\033[40;37m"
os_release=$(check_os_release)
if [ "X$os_release" == "X" ]
then
  echo -e "\033[1;40;31mThe OS does not identify,So this script is not executede.\n\033[0m"
  rm -f $LOCKfile
  exit 0
else
  echo -e "\033[40;32mThis OS is $os_release.\n\033[40;37m"
fi

echo -e "\033[40;32mStep 3.Begen to modify the source configration file and update.\n\033[40;37m"
update_source

echo -e "\033[40;32mStep 4.Begen to check and install vnc server.\n\033[40;37m"
case "$os_release" in
redhat5|centos5|aliyun5)
  centos5_install_vnc_server $os_release
  ;;
redhat6|centos6|aliyun6)
  centos6_install_vnc_server
  ;;
centos7)
  centos7_install_vnc_server
  ;;
ubuntu10|ubuntu1204|ubuntu1210|debian6)
  ubuntu_install_vnc_server
  ;;
esac

echo -e "\033[40;32mInstall success.The vnc password is \"$password\",this script now exit!\n\033[40;37m"
rm -f $LOCKfile

这里等待10分钟左右,当系统提示如下信息时,表示VNC Server 安装完成。您需要记录系统中显示的随机密码

# 验证

完毕!
Would you like to enter a view-only password (y/n)? A view-only password is not used
Password:Verify:Created symlink from /etc/systemd/system/multi-user.target.wants/vncserver@:1.service to /usr/lib/systemd/system/vncserver@:1.service.
● vncserver@:1.service - Remote desktop service (VNC)
   Loaded: loaded (/usr/lib/systemd/system/vncserver@:1.service; enabled; vendor preset: disabled)
   Active: active (running) since 一 2020-12-28 14:30:42 CST; 9ms ago
  Process: 106161 ExecStartPre=/bin/sh -c /usr/bin/vncserver -kill :1 > /dev/null 2>&1 || : (code=exited, status=0/SUCCESS)
 Main PID: 106165 (vncserver_wrapp)
   CGroup: /system.slice/system-vncserver.slice/vncserver@:1.service
           ├─106165 /bin/sh /usr/bin/vncserver_wrapper root :1
           └─106167 /usr/sbin/runuser -l root -c /usr/bin/vncserver :1

12月 28 14:30:42 summer1 systemd[1]: Starting Remote desktop service (VNC)...
12月 28 14:30:42 summer1 systemd[1]: Started Remote desktop service (VNC).
Install success.The vnc password is "ae3932",this script now exit!

[root@summer1 home]# netstat -tulnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 192.168.0.9:6379        0.0.0.0:*               LISTEN      14306/redis-server  
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      14306/redis-server  
tcp        0      0 0.0.0.0:5901            0.0.0.0:*               LISTEN      106208/Xvnc         
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      14475/nginx: master 
tcp        0      0 0.0.0.0:6001            0.0.0.0:*               LISTEN      106208/Xvnc         
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      47686/sshd          
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      54538/master        
tcp6       0      0 :::23306                :::*                    LISTEN      14040/mysqld        
tcp6       0      0 :::5901                 :::*                    LISTEN      106208/Xvnc         
tcp6       0      0 :::20080                :::*                    LISTEN      39682/java          
tcp6       0      0 192.168.0.9:29200       :::*                    LISTEN      14225/java          
tcp6       0      0 :::6001                 :::*                    LISTEN      106208/Xvnc         
tcp6       0      0 :::20081                :::*                    LISTEN      39842/java          
tcp6       0      0 192.168.0.9:29300       :::*                    LISTEN      14225/java          
tcp6       0      0 :::22                   :::*                    LISTEN      47686/sshd          
tcp6       0      0 :::28600                :::*                    LISTEN      28757/java          
tcp6       0      0 ::1:25                  :::*                    LISTEN      54538/master        
tcp6       0      0 :::28601                :::*                    LISTEN      40001/java          
tcp6       0      0 :::28602                :::*                    LISTEN      39682/java          
tcp6       0      0 :::28603                :::*                    LISTEN      39842/java          
udp        0      0 0.0.0.0:58612           0.0.0.0:*                           106635/avahi-daemon 
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           106635/avahi-daemon 
[root@summer1 home]# 

注意关闭防火墙或开放5901端口

# 重启vnc问题

[root@summer home]# systemctl status vncserver@:1.service
● vncserver@:1.service - Remote desktop service (VNC)
   Loaded: loaded (/usr/lib/systemd/system/vncserver@:1.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 三 2020-12-30 15:38:15 CST; 18h ago
  Process: 1656 ExecStart=/usr/bin/vncserver_wrapper root :1 (code=exited, status=2)
  Process: 1554 ExecStartPre=/bin/sh -c /usr/bin/vncserver -kill :1 > /dev/null 2>&1 || : (code=exited, status=0/SUCCESS)
 Main PID: 1656 (code=exited, status=2)

12月 30 15:38:14 summer systemd[1]: Starting Remote desktop service (VNC)...
12月 30 15:38:14 summer systemd[1]: Started Remote desktop service (VNC).
12月 30 15:38:15 summer vncserver_wrapper[1656]: Warning: summer:1 is taken because of /tmp/.X11-unix/X1
12月 30 15:38:15 summer vncserver_wrapper[1656]: Remove this file if there is no X server summer:1
12月 30 15:38:15 summer vncserver_wrapper[1656]: A VNC server is already running as :1
12月 30 15:38:15 summer vncserver_wrapper[1656]: FATAL: 'runuser -l root' failed!
12月 30 15:38:15 summer systemd[1]: vncserver@:1.service: main process exited, code=exited, status=2/INVALIDARGUMENT
12月 30 15:38:15 summer systemd[1]: Unit vncserver@:1.service entered failed state.
12月 30 15:38:15 summer systemd[1]: vncserver@:1.service failed.
[root@summer home]# fg
vim install_vnc_server.sh
[root@summer home]# systemctl start vncserver@:1.service
[root@summer home]# systemctl status vncserver@:1.service
● vncserver@:1.service - Remote desktop service (VNC)
   Loaded: loaded (/usr/lib/systemd/system/vncserver@:1.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 四 2020-12-31 10:01:00 CST; 14s ago
  Process: 103905 ExecStart=/usr/bin/vncserver_wrapper root :1 (code=exited, status=2)
  Process: 103901 ExecStartPre=/bin/sh -c /usr/bin/vncserver -kill :1 > /dev/null 2>&1 || : (code=exited, status=0/SUCCESS)
 Main PID: 103905 (code=exited, status=2)

12月 31 10:01:00 summer systemd[1]: Starting Remote desktop service (VNC)...
12月 31 10:01:00 summer systemd[1]: Started Remote desktop service (VNC).
12月 31 10:01:00 summer vncserver_wrapper[103905]: Warning: summer:1 is taken because of /tmp/.X11-unix/X1
12月 31 10:01:00 summer vncserver_wrapper[103905]: Remove this file if there is no X server summer:1
12月 31 10:01:00 summer vncserver_wrapper[103905]: A VNC server is already running as :1
12月 31 10:01:00 summer vncserver_wrapper[103905]: FATAL: 'runuser -l root' failed!
12月 31 10:01:00 summer systemd[1]: vncserver@:1.service: main process exited, code=exited, status=2/INVALIDARGUMENT
12月 31 10:01:00 summer systemd[1]: Unit vncserver@:1.service entered failed state.
12月 31 10:01:00 summer systemd[1]: vncserver@:1.service failed.
[root@summer home]# cd /tmp/.X11-unix/
[root@summer .X11-unix]# ls
X1
[root@summer .X11-unix]# ll
总用量 0
srwxrwxrwx. 1 root root 0 12月 28 14:30 X1
[root@summer .X11-unix]# mv X1 X1bak
[root@summer .X11-unix]# systemctl start vncserver@:1.service
[root@summer .X11-unix]# systemctl status vncserver@:1.service
● vncserver@:1.service - Remote desktop service (VNC)
   Loaded: loaded (/usr/lib/systemd/system/vncserver@:1.service; enabled; vendor preset: disabled)
   Active: active (running) since 四 2020-12-31 10:02:32 CST; 3s ago
  Process: 105659 ExecStartPre=/bin/sh -c /usr/bin/vncserver -kill :1 > /dev/null 2>&1 || : (code=exited, status=0/SUCCESS)
 Main PID: 105664 (vncserver_wrapp)
   CGroup: /system.slice/system-vncserver.slice/vncserver@:1.service
           ├─105664 /bin/sh /usr/bin/vncserver_wrapper root :1
           └─105810 sleep 0.1

12月 31 10:02:32 summer systemd[1]: Starting Remote desktop service (VNC)...
12月 31 10:02:32 summer systemd[1]: Started Remote desktop service (VNC).
12月 31 10:02:36 summer vncserver_wrapper[105664]: New 'summer:1 (root)' desktop is summer:1
12月 31 10:02:36 summer vncserver_wrapper[105664]: Starting applications specified in /root/.vnc/xstartup
12月 31 10:02:36 summer vncserver_wrapper[105664]: Log file is /root/.vnc/summer:1.log
[root@summer .X11-unix]#