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

news/2025/4/2 23:38:22/文章来源:https://www.cnblogs.com/ZhengLiming/p/18804120

云桌面项目由于缺少一键关机和开机功能,通过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 脚本的提示对开关机进行操作

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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/909517.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20242801 2024-2025-2 《网络攻防实践》第5次作业

一、实验内容 ​ 配置linux系统防火墙,并设置相关过滤规则;使用snort入侵检测工具进行离线扫描,并分析生成的报警日志。分析Honeywell的防火墙和IDS/IPS配置规则。 二、实验过程 (一)防火墙配置 1、过滤ICMP包 ​ ping命令通过设置icmp实现,所以我们使用ping命令来验证li…

“电脑玩手机神器Scrcpy!投屏/录屏/打游戏,1分钟搞定安装教程”

前言 什么是 Scrcpy?Scrcpy 是一款开源的 Android 屏幕镜像与控制工具,由 Genymobile 开发。它可以通过 USB 或 WiFi 将 Android 设备的屏幕实时显示到电脑上,并允许通过电脑的键盘和鼠标直接操作 Android 设备。 scrcpy 能帮你干啥?在电脑上玩手机——刷抖音、打游戏、聊微…

项目架构(下)--- 整合编写框架具体代码

项目结构 新建一个项目文件夹 通过 prisma init --datasource-provider mysql 构建prisma项目 代码编写main.tsimport "reflect-metadata"; import { InversifyExpressServer } from "inversify-express-utils"; import { Container } from "inversi…

逆天崛起!疆鸿智能EtherCAT转TCP/IP协议如何赋能食品加工厂数字化转型(建议收藏噢~)

在食品加工行业,智能化浪潮正以前所未有的速度重塑传统生产模式。从原料分拣到成品包装,每一道工序都对设备协同精度和数据响应速度提出严苛要求。然而,当企业投入巨资升级智能化设备后,却发现不同协议架构的设备如同操着不同方言的"生产孤岛",尤其是EtherCAT总…

SynTIDE:首个基于文本生成水下图像与密集注释数据集

2025-03-28,由华中科技大学的研究团队创建一种创新的水下数据合成方法 TIDE(Text-to-Image and DEnse annotation generation method)。该方法仅依赖文本输入,就能同时生成逼真的水下图像和多种高度一致的密集注释(如深度图和语义分割掩码)。TIDE 的出现有效缓解了水下场…

Linux-常用命令(2)

Linux常用命令 删除文件 rm命令 rm命令可以删除文件或者目录,系统不会产生任何提示 rm -r 文件名 //递归删除,主要用于删除目录以及它包含的内容 rm -f 文件名 //强制删除,系统不会询问,直接删除指定的目录或者文件 rm -i 文件名 //在删除的时候系统会提示要不要删除 rm…

【UWP】让 UWP 自己和自己通信

众所周知,UWP 一般是运行在沙盒里面的,当我们需要访问沙盒外资源的时候,就需要通过沙盒外的代理服务器来获取。一般情况下我们都是利用 WinRT API 通过 Runtime Broker 来和沙盒外互通,遇到要自定义的情况则是手动开一个 Win32 服务器来互通,但是有没有可能我们可以直接拿…

通义灵码助力技术求职:如何成为笔试面试冲刺的“超级助手”

在技术岗位竞争日益激烈的当下,求职季的备战已不仅是知识储备的较量,更是效率与实战能力的比拼。面对海量面试题、复杂算法挑战及快速迭代的技术框架,开发者亟需高效工具辅助突破瓶颈。阿里云推出的智能编码工具通义灵码,凭借其代码生成、优化及智能问答等核心能力,正成为…

项目架构(中)-- 依赖库【reflect-metadata】【inversify】【inversify-express-utils】

之前的文章已经学习了接口编写express 官网 orm框架 prisma 官网我们需要再学习:inversify + reflect-metadata 实现依赖注入 官网连接工具 inversify-express-utils 官网dto class-validator + class-transformer 官网reflect-metadata是一个 JavaScript 库,用于在运行时…

Linux-常用命令(1)

Linux-常用命令(1)基本命令 用户权限 sudo命令 linux系统,用户分为超级用户(root用户,拥有一切权限)和普通用户 sudo命令可以不在root权限下执行管理员的权限,使用此命令用户可以使用管理员的权限,下载和配置文件,使用sudo也可以将普通用户切换为root用户 sudo su //…

企业级电脑监控解决方案如何选?华企盾DSC助力高效管控

随着企业数字化转型加速,办公终端已成为企业运营的核心载体。如何有效规范员工数字化办公行为、防范数据泄露风险,已成为现代企业管理的必修课。华企盾DSC数据防泄密系统作为专业的企业级终端管理方案,为企业提供全方位的管控支持。1. 应用程序分级管控系统支持建立应用程序…

higress~Remote MCP Server 托管方案

文章出处:https://www.53ai.com/news/OpenSourceLLM/2025032902736.htmlMCP Server 的实施存在着诸多挑战,特别是在认证授权、服务可靠性和可观测性方面,Higress 作为 AI 原生的 API 网关,提供了完整的开源 MCP Server 托管解决方案。即将上线的 MCP 市场,将大幅降低开发者…