云桌面项目由于缺少一键关机和开机功能,通过Linux实现自动化调用开机和关机
1、收集所有终端信息的MAC地址
收集方式可以采用ipscan25.exe也可以通过cmd下arp -a方式收集MAC地址,同时记录MAC可以IP地址的对应关系。
2、所有终端安装openssh
使用系统自带或者下载OpenSSH-Win64-v9.5.0.0.msi插件,安装后确定openssh服务属于自动状态
3、创建终端登录用户
创建终端登录用户必须具体管理员权限
命令创建用户 net user user user /add /passwordchg:No #创建用户且不允许修改密码 net user user /active:yes #激活用户 wmic.exe UserAccount Where Name='user' Set PasswordExpires=false #密码不过期 net localgroup administrators user /add #修改权限组
|
4、利用一台同局域网的centos系统部署控制端
安装expect tcl
# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
# yum -y install expect tcl wol
创建统一标准目录
#mkdir /source
上传脚本文件到/source 下
使用sftp工具上传所有文件到云平台上的/source目录下
# mkdir -p /source/IP-MAC/11/IP-11.txt
注意:目录结构说明
/source/ 为主目录
center.sh #主执行文件
guide.sh #跨网段调用文件
stops.sh #关机文件(具备终端刷机、账号更新、背景和参数文件更换等)
start.sh #开机文件
stopsypt.sh #关闭云桌面自启动作
startsypt.sh #开启云桌面自启动作
Host_shutdown.sh #关机所有物理服务器
/source/IP-MAC/ 为IP和MAC地址主目录
/source/IP-MAC/11/ 为教室主目录
/source/IP-MAC/11/IP-11.txt 为IP和MAC存在文件
文件内容格式必须按照(每行表示一台终端信息):IP地址,用户,密码,MAC地址

记录IP地址标准文件

5、跨网段脚本调用环境初始化
由于客户想在一个终端上操作其他云平台上的脚本,这里使用ssh互信和sudo权限进行远程调用脚本并且不给root用户登录权限,客户只需要点击CRT中的连接信息就可以看到命令调用执行提示语 创建user用户 # useradd user
设置user登录密码 # echo user | passwd --stdin user
配置sudo原先,赋予root执行权限 #[root@node2 ~]# cat /etc/sudoers | grep "user ALL=" #user ALL=(root) NOPASSWD:ALL
添加环境变量 #[root@node2 ~]# cat /home/user/.bash_profile | grep sudo #sudo /bin/sh /source/center.sh
以下操作需要再主云平台系统上进行部署 创建ssh公钥 #root@pve:~# ssh-keygen
root@pve:~# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/id_rsa already exists. Overwrite (y/n)? y Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa Your public key has been saved in /root/.ssh/id_rsa.pub The key fingerprint is: SHA256:6//JZjtAA5Yjb5Z/20iPJSe7k4Zhiz6TlgfFXjd13pU root@pve The key's randomart image is: +---[RSA 3072]----+ | . .| | . = E+| | + = o+| | = = . o o| | oS= o . . | | ..* = o | | .* B & | | .B +.%.o | | oo=.=*= | +----[SHA256]-----+ root@pve:~#
创建本机跟其他云平台节点user用户互信,包含本机user互信,多个云平台节点将多次执行户型操作 # ssh-copy-id -i /root/.ssh/id_rsa.pub user@172.16.0.251 注意:这里的172.16.0.251是云平台的IP地址,如果有多个云平台就需要多次执行互信操作
|
6、脚本说明
center.sh |
#!/bin/bash
while :; do read -p "请根据以下提示选择教室编号和执行命令(y/n):" status if [ "${status}" == "y" ];then clear while :; do echo -e "\n1006\n1101\n1102\n1103\n1104\n1201-1\n1201-2\n1201-3\n1201-4\n1202\n提示关闭机房服务器输入:Host-shutdown\n" read -p "请根据以上提示选择教室编号:" js if [ "a${js}" == "a1006" ] || [ "a${js}" == "a1101" ] || [ "a${js}" == "a1102" ] || [ "a${js}" == "a1103" ] || [ "a${js}" == "a1104" ] || [ "a${js}" == "a1201-1" ] || [ "a${js}" == "a1201-2" ] || [ "a${js}" == "a1201-3" ] || [ "a${js}" == "a1201-4" ] || [ "a${js}" == "a1202" ];then if [ "a${js}" == "a1006" ];then IPS='172.16.0.251' elif [ "a${js}" == "a1101" ];then IPS='172.16.1.251' elif [ "a${js}" == "a1102" ];then IPS='172.16.2.251' elif [ "a${js}" == "a1103" ];then IPS='172.16.3.251' elif [ "a${js}" == "a1104" ];then IPS='172.16.4.251' elif [ "a${js}" == "a1201-1" ] || [ "a${js}" == "a1201-2" ] || [ "a${js}" == "a1201-3" ] || [ "a${js}" == "a1201-4" ] || [ "a${js}" == "a1202" ];then IPS='172.16.8.251' fi while :; do echo -e "\n1: 开机\n2: 关机\n3:关闭云平台\n4:开启云平台" read -p "请根据以上提示选择执行编号:" zx if [ "a${zx}" == "a1" ];then #start ${js} ssh user@${IPS} "source /etc/profile;sudo /bin/sh /source/guide.sh start ${js}" echo "${js}教室一体机已开机, 请检查开机情况......" break elif [ "a${zx}" == "a2" ];then #stop ${js} #ssh user@${IPS} "source /etc/profile;sudo /bin/sh /source/guide.sh stop ${js}" &>/source/logfile.log ssh user@${IPS} "source /etc/profile;sudo /bin/sh /source/guide.sh stop ${js}" echo "${js}教室一体机关开机, 请检查关机情况......" break elif [ "a${zx}" == "a3" ];then #stop ${js} ssh user@${IPS} "source /etc/profile;sudo /bin/sh /source/guide.sh stopypt ${js}" echo "${js}教室一体机关开机, 请检查关机情况......" break elif [ "a${zx}" == "a4" ];then #stop ${js} ssh user@${IPS} "source /etc/profile;sudo /bin/sh /source/guide.sh startypt ${js}" echo "${js}教室一体机关开机, 请检查关机情况......" break else clear echo -e "执行编号输入有误,请重新输入\n-----------------------------" fi done echo -e "\n" read -p "请根据实际需求是否需要对其他教室进行开关机操作(y/n): " status_1 if [ "a${status_1}" == "an" ];then echo "已退出脚本,如需继续操作请重新执行脚本......" exit elif [ "a${status_1}" == "ay" ];then echo -e "\n" else echo -e "执行编号输入有误, 自动退出脚本,如需继续操作请重新执行脚本......" exit fi elif [ "a${js}" == "aHost-shutdown" ];then read -p "***确认每层教室终端是否都已关闭(y/n):" shutdown_client if [ "a${shutdown_client}" == "ay" ];then read -p "***确定是否关闭机房服务器(y/n):" shutdown if [ "a${shutdown}" == "ay" ];then echo "机房服务器正在关闭中,请稍等5分钟再断电......" sh /source/Host_shutdown.sh sleep 30 fi else echo "请先将每层教室终端都关机后再关闭服务器,避免服务器被关后无法远程关闭终端。" fi else clear echo -e "教室编号输入有误,请重新输入 \n-----------------------------" #continue fi done
elif [ "a${status}" == "an" ];then echo "已退出脚本" exit else clear echo "输入有误, 请重新选择(y/n)" continue fi done
|
guide.sh |
#!/bin/bash
function stop(){ Jsbh=`echo "$*" | cut -c 1-4` for i in `cat /source/IP-MAC/${Jsbh}/IP-$*.txt` do host=`echo "${i}" | awk -F',' '{print$1}'` user=`echo "${i}" | awk -F',' '{print$2}'` passwd=`echo "${i}" | awk -F',' '{print$3}'` echo "********************终端 ${host} 开始替换配置文件********************" expect /source/stops.sh ${host} ${user} ${passwd} echo "$* expect /source/stops.sh ${host} ${user} ${passwd}" echo -e "--------------------配置文件替换完成--------------------\n" done }
function start(){ Jsbh=`echo "$*" | cut -c 1-4` for i in `cat /source/IP-MAC/${Jsbh}/IP-$*.txt` do echo ${i} | awk -F',' '{print$4}' | xargs -I {} wol {} #echo "$* ${i}" done }
function stopypt(){ Jsbh=`echo "$*" | cut -c 1-4` for i in `cat /source/IP-MAC/${Jsbh}/IP-$*.txt` do host=`echo "${i}" | awk -F',' '{print$1}'` user=`echo "${i}" | awk -F',' '{print$2}'` passwd=`echo "${i}" | awk -F',' '{print$3}'` echo "********************终端 ${host} 开始替换配置文件********************" expect /source/stopsypt.sh ${host} ${user} ${passwd} echo "$* expect /source/stops.sh ${host} ${user} ${passwd}" echo -e "--------------------配置文件替换完成--------------------\n" done }
function startypt(){ Jsbh=`echo "$*" | cut -c 1-4` for i in `cat /source/IP-MAC/${Jsbh}/IP-$*.txt` do host=`echo "${i}" | awk -F',' '{print$1}'` user=`echo "${i}" | awk -F',' '{print$2}'` passwd=`echo "${i}" | awk -F',' '{print$3}'` echo "********************终端 ${host} 开始替换配置文件********************" expect /source/startsypt.sh ${host} ${user} ${passwd} echo "$* expect /source/stops.sh ${host} ${user} ${passwd}" echo -e "--------------------配置文件替换完成--------------------\n" done }
$1 $2
|
stops.sh |
#!/bin/bash #!/usr/bin/expect
set host [lindex $argv 0 ] set user [lindex $argv 1 ] set passwd [lindex $argv 2 ]
set timeout 3
#上传文件功能 proc puts { host user passwd } { spawn scp -p 22 /source/Student_2.7.13367.exe /source/a.bat $user@$host:c:\\ expect { "*yes/no" {send "yes\r";exp_continue} "*password:" {send "$passwd\r"} } #expect 100% expect eof }
#执行命令功能 proc comms { host user passwd comm } { spawn ssh -p 22 $user@$host expect { "*yes/no" {send "yes\r";exp_continue} "*password:" {send "$passwd\r"} } expect "]*" send "$comm" send "exit\r"
expect eof }
#关机 set NUM [ comms $host $user $passwd "shutdown /s /t 0\r"]
#重启 #set NUM [ comms $host $user $passwd "shutdown /r /t 0\r"]
#安装极域客户端 #set NUM [ puts $host $user $passwd ] #set NUM [ comms $host $user $passwd "c:/a.bat \r"] #set NUM [ comms $host $user $passwd "shutdown /r /t 0\r"]
|
start.sh |
#!/bin/bash
js=$1
for i in `cat /source/IP-MAC/${js}/IP-${js}.txt` do echo ${i} | awk -F',' '{print$4}' | xargs -I {} wol {} done
|
stopsypt.sh |
#!/bin/bash #!/usr/bin/expect
set host [lindex $argv 0 ] set user [lindex $argv 1 ] set passwd [lindex $argv 2 ]
set timeout 3
#上传文件功能 proc puts { host user passwd } { spawn scp -p 22 /source/b.bat $user@$host:c:\\ expect { "*yes/no" {send "yes\r";exp_continue} "*password:" {send "$passwd\r"} } #expect 100% expect eof }
proc comms { host user passwd comm } { spawn ssh -p 22 $user@$host expect { "*yes/no" {send "yes\r";exp_continue} "*password:" {send "$passwd\r"} } expect "]*" send "$comm" send "exit\r"
expect eof }
#关机 #set NUM [ comms $host $user $passwd "shutdown /s /t 0\r"]
#关闭融合云桌面启动项 set NUM [ puts $host $user $passwd ] set NUM [ comms $host $user $passwd "c:/b.bat \r"] set NUM [ comms $host $user $passwd "move C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\\"Start Menu\"\\Programs\\Startup\\融合云桌面.lnk C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\\"Start Menu\"\\Programs \r"]
#开启融合云桌面启动项 #set NUM [ comms $host $user $passwd "move C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\\"Start Menu\"\\Programs\\融合云桌面.lnk C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\\"Start Menu\"\\Programs\\Startup \r"]
#重启 set NUM [ comms $host $user $passwd "shutdown /r /t 0\r"]
|
startsypt.sh |
#!/bin/bash #!/usr/bin/expect
set host [lindex $argv 0 ] set user [lindex $argv 1 ] set passwd [lindex $argv 2 ]
set timeout 3
proc comms { host user passwd comm } { spawn ssh -p 22 $user@$host expect { "*yes/no" {send "yes\r";exp_continue} "*password:" {send "$passwd\r"} } expect "]*" send "$comm" send "exit\r"
expect eof }
#关机 #set NUM [ comms $host $user $passwd "shutdown /s /t 0\r"]
#关闭融合云桌面启动项 #set NUM [ comms $host $user $passwd "move C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\\"Start Menu\"\\Programs\\Startup\\融合云桌面.lnk C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\\"Start Menu\"\\Programs \r"]
#开启融合云桌面启动项 set NUM [ comms $host $user $passwd "move C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\\"Start Menu\"\\Programs\\融合云桌面.lnk C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\\"Start Menu\"\\Programs\\Startup \r"]
#重启 set NUM [ comms $host $user $passwd "shutdown /r /t 0\r"]
|
Host_shutdown.sh |
#!/bin/bash
#11楼服务器 timeout 3 ssh root@172.16.1.253 "init 0" timeout 3 ssh root@172.16.1.250 "init 0"
timeout 3 ssh root@172.16.2.253 "init 0" timeout 3 ssh root@172.16.2.250 "init 0"
timeout 3 ssh root@172.16.3.253 "init 0" timeout 3 ssh root@172.16.3.250 "init 0"
timeout 3 ssh root@172.16.4.253 "init 0" timeout 3 ssh root@172.16.4.250 "init 0"
#12楼服务器 timeout 3 ssh root@172.16.8.253 "init 0" timeout 3 ssh root@172.16.8.250 "init 0" timeout 3 ssh root@172.16.8.247 "init 0" timeout 3 ssh root@172.16.8.244 "init 0" timeout 3 ssh root@172.16.8.241 "init 0" timeout 3 ssh root@172.16.8.238 "init 0" timeout 3 ssh root@172.16.8.235 "init 0" timeout 3 ssh root@172.16.8.232 "init 0" timeout 3 ssh root@172.16.8.229 "init 0"
#10楼服务器 timeout 3 ssh root@172.16.0.250 "init 0" sleep 3 timeout 3 ssh root@172.16.0.253 "init 0" #init 0
#检测服务器是否能通 #for i in `seq 235 253` ;do ping -w1 -c 1 192.168.0.${i} | grep 'time=' | awk '{print$4}';done
|
7、脚本测试结果
将所有脚本文件放在/source/目录下,通过执行 center.sh 脚本的提示对开关机进行操作
例子: 以下图片跟实际脚本运行会有差异,主要增加功能
