Windows执行脚本远程关闭Linux服务器

需求:

目前项目上有一个需求:当市电断电后,使用ups供电时,ups会实时的通过RS232串口将自身电量数据信息发送给电脑(Windows端),当电量低于所设定的阈值时,通知电脑进行关机,防止意外断电造成的数据丢失,系统损坏硬件故障,给企业造成巨大损失。可是目前程序只支持Windows端,不支持Linux,所有想用Windows通过ssh远程连接到Linux服务器上,执行shutdown关机指令

 

解决方案:

1、Windows上需先安装python以及paramiko库

 

2、将以下代码保存为shutdown.py文件,然后在cmd命令行中执行即可(可能有些没有root权限的账户,需要配置sudo免密执行,请看这篇文章 https://www.cnblogs.com/xiykj/p/18872324)

import paramiko
class SshClass:
    """
    ssh连接对象
    本对象提供了密钥连接、密码连接、命令执行、关闭连接
    """
    ip = ''
    port = 22
    username = ''
    timeout = 0
    ssh = None

    def __init__(self, ip, username, port=22, timeout=30):
        """
        初始化ssh对象
        :param ip: str  主机IP
        :param username: str  登录用户名
        :param port: int  ssh端口
        :param timeout: int  连接超时
        """
        self.ip = ip
        self.username = username
        self.port = port
        self.timeout = timeout
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        self.ssh = ssh

    def conn_by_key(self, key):
        """
        密钥连接
        :param key: str  rsa密钥路径
        :return: ssh连接对象
        """
        rsa_key = paramiko.RSAKey.from_private_key_file(key)
        self.ssh.connect(hostname=self.ip, port=self.port, username=self.username, pkey=rsa_key, timeout=self.timeout)
        if self.ssh:
            print("密钥连接成功.")
        else:
            self.close()
            raise Exception("密钥连接失败.")

    def conn_by_pwd(self, pwd):
        """
        密码连接
        :param pwd: str  登录密码
        :return: ssh连接对象
        """
        self.ssh.connect(hostname=self.ip, port=self.port, username=self.username, password=pwd)
        if self.ssh:
            print("密码连接成功.")
        else:
            self.close()
            raise Exception("密码连接失败.")

    def exec_command(self, command):
        """
        命令控制
        :param command: str  命令
        :return: dict  命令执行的返回结果
        """
        if command:
            stdin, stdout, stderr = self.ssh.exec_command(command)
            return {
                "stdin": command,
                "stdout": stdout.read(),
                "stderr": stderr.read()
            }
        else:
            self.close()
            raise Exception("命令不能为空字符串.")

    def close(self):
        """
        关闭当前连接
        :return:
        """
        if self.ssh:
            self.ssh.close()
        else:
            raise Exception("ssh关闭失败,当前对象并没有ssh连接.")


if __name__ == '__main__':
    SSH = SshClass("192.168.19.128", "root", port=22)    #192.168.19.128为Linux服务器ip,root为账户名,port=22为ssh端口号
    SSH.conn_by_pwd("123456")    #123456为登录Linux服务器密码
    print(SSH.exec_command("sudo shutdown -h now"))    #sudo shutdown -h now为要执行的指令

 

3、将如下代码保存为shutdown.bat文件,最后双击执行该文件即可关闭Linux服务器

@echo off
echo.&echo Linux关机脚本程序
title Linux关机脚本程序
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit cd /d "%~dp0"
start D:\shutdown.py    #这里的路径请配置第二步保存的shutdown.py脚本文件路径
echo.&pause

 

posted @ 2025-05-12 19:00  凡是過往;皆為序章  阅读(108)  评论(0)    收藏  举报