云终端远程自动调用开关机功能

云桌面项目由于缺少一键关机和开机功能,通过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

 

7、脚本测试结果

  将所有脚本文件放在/source/目录下,通过执行 center.sh 脚本的提示对开关机进行操作

例子: 以下图片跟实际脚本运行会有差异,主要增加功能

 

posted @ 2025-04-01 14:51  ZhengLiming  阅读(50)  评论(0)    收藏  举报