PYTHON通过跳板机巡检CENTOS的简单实现

news2024/12/27 10:49:11

实现的细节和引用的文件和以前博客记录的基本一致

https://shaka.blog.csdn.net/article/details/106927633

差别在于,这次是通过跳板机登陆获取的主机信息,只记录差异的部份

1.需要在跳板机相应的路径放置PYTHON的脚本resc.py

resc.py这个脚本中有引用的文件(pm.sh,diskpnum.sh)和以前的记录一样,不再重复列出

这个脚本接受一个参数,IP地址,django一端的服务器将通过SSH连接,并将参数传递给脚本执行

脚本将返回包含CPU,内存,磁盘信息的字典,因为不同主机的磁盘分区名称和数量的不一致性,带有磁盘信息的这个KEY的值,将是一个LIST

# -*- coding: utf-8 -*-
import os,sys
import paramiko
import time
import sys
reload(sys)
import os
import json
import multiprocessing
import signal
sys.setdefaultencoding('utf-8')

class TimeoutException(Exception):
    pass

def timeout_handler(signum, frame):
    raise TimeoutException("error")

def sshreinfos(ips):
    try:
        redict = {}
        paramiko.util.log_to_file("/yourreexecpath/paramiko.log")
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        pkey = paramiko.RSAKey.from_private_key_file("/home/user/.ssh/id_rsa")
        ssh.connect(hostname=ips, port=22, username='sshuser', pkey=pkey, timeout=5)
        t = ssh.get_transport()
        sftp=paramiko.SFTPClient.from_transport(t)
        sftp.put("/yourreexecpath/pm.sh","/tmp/pm.sh")
        sftp.put("/yourreexecpath/diskpnum.sh", "/tmp/diskpnum.sh")
        stdindcpu, stdoutcpu, stderrcpu = ssh.exec_command("top -bn1 | awk '/Cpu/{print $2,$3,$4}' | sed 's/[a-z]//g' | sed 's/ //g' | awk -F',' '{print $1+$2+$3}'")
        stdinmomeryall, stdoutmomeryall, stderrmomeryall = ssh.exec_command("free -m | awk '{print $2}' | awk 'NR==2{print}'")
        stdinmomery, stdoutmomery, stderrmomery = ssh.exec_command("sh /tmp/pm.sh")
        musep = (stdoutmomery.read()).replace("\n", "")
        cpuusep = (stdoutcpu.read()).replace("\n", "")
        memoryall = (stdoutmomeryall.read()).replace("\n", "")
        remark = "正常"
        try:
            b = round(float(musep))
            if int(b) > 80:
                remark = "评估是否扩内存"
        except Exception:
            remark = "NONE"

        redict["ips"] = ips
        redict["stdoutcpu"] = cpuusep
        redict["stdoutmomeryall"] = memoryall
        redict["musep"] = musep
        redict["remark"] = remark

        ymdhms = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
        stdindps, stdoutdps, stderrdps = ssh.exec_command("sh /tmp/diskpnum.sh " + ymdhms)
        dpnums = (stdoutdps).read().replace("\n", "")
        # print "1.5$"
        sftp.get("/tmp/diskusetmp" + ymdhms + ".txt", "/yourreexecpath/"+ips + "diskusetmp" + ymdhms + ".txt")
        diskinfos = open("/yourreexecpath/"+ips + "diskusetmp" + ymdhms + ".txt", 'r')
        disklists = []
        for lines in diskinfos:
            diskitems = {}
            cons = lines.split()
            diskitems["pt"] = cons[0].strip()
            diskitems["pttotal"] = cons[1].strip()
            diskitems["ptuse"] = cons[2].strip()
            disklists.append(diskitems)

        diskinfos.close()
        os.remove("/yourreexecpath/"+ips + "diskusetmp" + ymdhms + ".txt")
        redict["disklists"] = disklists
        ssh.close()
        return redict

    except:
        #print "error"
        return "error"

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print "argv must be one"
        exit()
    ips = sys.argv[1]
    signal.signal(signal.SIGALRM, timeout_handler)
    signal.alarm(10) # set timeout to 10 seconds
    try:
        print sshreinfos(ips)
    except TimeoutException:
        print("error")

2.django一端的实现如下:

views.py对应的方法

用户点击不同的按钮选择是打印到WEB页面,还是打印到WEB页面+下载巡检报告的EXCEL表格

request.POST.has_key('chkaproc')或request.POST.has_key('chkonlylists')
def chkosinfos(request):
    if request.method=="POST":
        sqlstr = request.POST.get("sqlstr")
        filenames=""
        if request.POST.has_key('chkaproc'):
            try:
                import f5.sysinfos
                #filenames,relists=f5.sysinfos.receivewebsqlstr(sqlstr)
                relists=f5.sysinfos.remoterelists(sqlstr)
                filenames=f5.sysinfos.remotereexcel(relists)

            except Exception:
                return render(request,"exportsysinfos.html",{"login_err":"SYSINFOSFAILSTEP1"})

            return render(request,"exportsysinfos.html",{"login_err":"downloadlink:http://web服务器IP地址(存放文件用,程序将文件生成到指定的web虚拟目录):9999/"+filenames,"templist":relists})

        if request.POST.has_key('chkonlylists'):
            try:
                import f5.sysinfos
                relists=f5.sysinfos.remoterelists(sqlstr)

            except Exception:
                return render(request,"exportsysinfos.html",{"login_err":"SYSINFOSFAILSTEP1"})

            return render(request,"exportsysinfos.html",{"login_err":"OKAY"+filenames,"templist":relists})

    else:
        return render(request,"exportsysinfos.html",{"login_err":"no set"})

views.py引用的两个方法

remoterelists返回多个服务器巡检信息的list
remotereexcel将信息写入excel        

# -*- coding: utf-8 -*-
import os,sys
#sys.setdefaultencoding('utf8')
import paramiko
import xlsxwriter
import time
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from multiprocessing import Process,Manager
import multiprocessing
import os
import json

def sshconn():
    try:
        ssh = paramiko.SSHClient()
        ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
        #ssh.connect(hostname=self.f5ips, port=22, username=self.usernames, password=self.passwords)
        pkey = paramiko.RSAKey.from_private_key_file("D:\\idrsapath\\id_rsa")
        ssh.connect(hostname="serveripaddress", port=22, username='sshuser', pkey=pkey, timeout=5)#连接跳板机
        return ssh
    except Exception:
        return "error"

def remoterelists(sqlstrs):
    relists=[]
    iplists = []
    for line in sqlstrs.splitlines():
        con = line.split()
        names = con[0].strip()
        iplists.append(names)
    try:
        ssh=sshconn()
        for ips in iplists:
            print ips
            start_time = time.time()
            try:
                stdindcmd, stdoutcmd, stderrcmd=ssh.exec_command("/usr/bin/python /yourreexecpath/resc.py " + ips)
                ipsdict=stdoutcmd.read().replace("\n", "")#.decode('utf-8')
                end_time = time.time()
                if end_time - start_time > 10:
                    continue
                if ipsdict != "error":
                    relists.append(eval(ipsdict))
            except:
                print "error remotecmds"
                pass

        ssh.close()
        return relists
    except:
        print "connect sshserver error"
        return "error"


def remotereexcel(excellists):
    nowtime=time.strftime('%Y-%m-%d-%H-%M-%S',time.localtime(time.time()))+""
    filenames=nowtime+'systeminfo.xlsx'
    workbook1 = xlsxwriter.Workbook(".\\uploads\\"+filenames)
    worksheet = workbook1.add_worksheet()
    t1='服务器运行情况'
    format=workbook1.add_format()
    #worksheet.set_column(0,15,20)
    format.set_bold()
    yellow=workbook1.add_format({'align':'center','valign':'vcenter','font_size':22,'fg_color':'FFC1C1'})
    yellow.set_bold()
    # worksheet.merge_range(0,0,0,4,t1,yellow)
    worksheet.merge_range('A1:I1',t1,yellow)
    worksheet.set_row(0, 38)
    worksheet.set_column("A:A",20)
    worksheet.set_column("B:B",11)
    worksheet.set_column("C:C",12)
    worksheet.set_column("D:D",12)
    worksheet.set_column("E:E",20)

    title=[u'IP地址',u'CPU使用率%',u'内存总量',u'内存使用率%',u'巡检结果']
    format=workbook1.add_format()
    format=workbook1.add_format({'align':'center','valign':'vcenter'})
    format.set_bold()
    worksheet.write_row('A2',title,format)
    worksheet.set_row(1, 25)
    row=2
    try:
        for lines in excellists:
            try:
                worksheet.write(row,0,lines["ips"])
                worksheet.write(row,1,lines["stdoutcpu"])
                worksheet.write(row,2,lines["stdoutmomeryall"])
                worksheet.write(row,3,lines["musep"])
                remark="正常"
                try:
                    b=round(lines["musep"])
                    if int(b)>80:
                        remark="评估是否扩内存"
                except Exception:
                    remark="NONE"
                worksheet.write(row,4,remark)
                ymdhms=time.strftime('%Y%m%d%H%M%S',time.localtime(time.time()))
                n=5
                for diskpts in lines["disklists"]:
                    worksheet.set_column(n,n,20)
                    worksheet.write(row,n,"分区 "+diskpts["pt"].strip())
                    worksheet.set_column(n+1,n+1,20)
                    worksheet.write(row,n+1,"分区大小 "+diskpts["pttotal"].strip())
                    worksheet.set_column(n+2,n+2,20)
                    try:
                        dps=round(float(diskpts["ptuse"].strip()))
                        if int(dps)>80:
                            formatmred = workbook1.add_format({'bold': True, 'font_color': 'red'})
                            worksheet.write(row,n+2,"分区使用率 "+diskpts["ptuse"].strip(),formatmred)
                        else:
                            worksheet.write(row,n+2,"分区使用率 "+diskpts["ptuse"].strip())
                    except Exception:

                        worksheet.write(row,n+2,"分区使用率未获取数据")
                    n=n+3

            except Exception:
                print lines["ips"] +" error"
                worksheet.write(row,0,lines["ips"])
                worksheet.write(row,1,"none")
                worksheet.write(row,2,"none")
                worksheet.write(row,3,"none")
            row=row+1
    except Exception:
        print "cannot get datas"
        return "error"
    return filenames

3.HTML页面将用户需要巡检的IP列表粘贴到输入框,一行一个IP

html的写法,不怎么会写,只是先写个实现

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>EXPORTHISTORYVALUES</title>
</head>
<body>
	<div id="container" class="cls-container">
		<div id="bg-overlay" ></div>
		<div class="cls-header cls-header-lg">
			<div class="cls-brand">
                <h3>主机巡检并导出信息</h3>每行一个IP
			</div>
		</div>
		<div class="cls-content">
			<div class="cls-content-sm panel">
				<div class="panel-body">

					<form id="loginForm" action="{% url 'chkosinfos' %}" method="POST"> {% csrf_token %}
						<div class="form-group">
							<div class="input-group">
								<div class="input-group-addon"><i class="fa fa-user"></i></div>
                                <textarea type="text" class="form-control" name="sqlstr" placeholder="主机巡检并导出信息,每行一个IP" style="width:600px;height:111px"></textarea></br>
							</div>
						</div>
                        </br></br>
<button class="btn btn-success btn-block" type="submit" name="chkaproc">
							<b>CHK+EXCEL下载链接</b>
						</button>
                        </br></br>
                        <button class="btn btn-success btn-block" type="submit" name="chkonlylists">
							<b>CHK不需要EXCEL,仅网页展示</b>
						</button>
                        <h4 style="color: #ff0000"><b>{{ login_err }}</b></h4>

{% for row in templist %}
<td>IP:{{ row.ips }}</td></br>
<td><div style="color:{% if row.stdoutcpu|floatformat:"0"|add:"0" >= 50 %}red{% else %}black{% endif %}">CPU使用率:{{ row.stdoutcpu }}</div></td></br>
<td>内存总量M:{{ row.stdoutmomeryall }}</td></br>
<td><div style="color:{% if row.musep|floatformat:"0"|add:"0" >= 90 %}red{% else %}black{% endif %}"> 内存使用率:{{ row.musep }} </div> </td></br>
{% if 'disklists' in row %}
{% for diskrows in row.disklists %}
<td><div style="color:{% if diskrows.ptuse|floatformat:"0"|add:"0" >= 90 %}red{% else %}black{% endif %}"> 分区名称:{{ diskrows.pt }}  分区容量:{{ diskrows.pttotal }}  分区
{#                        <h4 style="color: red"><b>{{ login_err }}</b></h4>#}
					</form>
				</div>
			</div>
		</div>
	</div>
</body>
</html>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

强化学习求解TSP(四):Qlearning求解旅行商问题TSP(提供Python代码)

一、Qlearning简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于奖励的决策问题。它是一种无模型的学习方法&#xff0c;通过与环境的交互来学习最优策略。Q-learning的核心思想是通过学习一个Q值函数来指导决策&#xff0c;该函数表示在给定状态下采取某个动作所获…

Linux驱动学习—输入子系统

1、什么是输入子系统&#xff1f; 输入子系统是Linux专门做的一套框架来处理输入事件的&#xff0c;像鼠标&#xff0c;键盘&#xff0c;触摸屏这些都是输入设备&#xff0c;但是这邪恶输入设备的类型又都不是一样的&#xff0c;所以为了统一这些输入设备驱动标准应运而生的。…

使用FFmpeg+EasyDarwin搭建音视频推拉流测试环境

1. 前言 在上一篇文章《使用VS2017在win10 x64上编译调试FFmpeg&#xff08;附源码和虚拟机下载&#xff09;》中&#xff0c;我们讲解了如何搭建FFmpeg源码编译和调试环境。 调试FFmpeg&#xff0c;还需要搭建流媒体服务器。流媒体服务器的作用是通过网络对外提供音视频服务…

固乔快递查询助手:一键批量查询,省时省力

在快递行业飞速发展的今天&#xff0c;高效、准确地掌握快递信息对于电商卖家、物流公司管理者以及经常需要查询快递信息的消费者来说至关重要。固乔快递查询助手正是为此而生&#xff0c;它的批量查询功能为用户带来前所未有的便利和高效。 首先&#xff0c;如何下载固乔快递查…

Win10子系统Ubuntu实战(二)

在 Windows 10 中安装 Ubuntu 子系统&#xff08;Windows Subsystem for Linux&#xff0c;简称 WSL&#xff09;有几个主要的用途和好处&#xff1a;Linux 环境的支持、跨平台开发、命令行工具、测试和验证、教育用途。总体而言&#xff0c;WSL 提供了一种将 Windows 和 Linux…

统信UOS虚拟机安装VirtualBox扩展使用USB功能

为什么要安装VirtualBox扩展包&#xff1f; 安装 Oracle VM VirtualBox 扩展包的原因是&#xff0c;它提供了对 USB 2.0、USB 3.0、远程桌面协议 VRDP&#xff08;VirtualBox Remote Desktop Protocol&#xff09;等实用功能的支持&#xff0c;以增强 VirtualBox 的功能。这些…

一文读懂大型语言模型参数高效微调:Prefix Tuning与LLaMA-Adapter

芝士AI吃鱼 在快速发展的人工智能领域中&#xff0c;高效、有效地使用大型语言模型变得日益重要&#xff0c;参数高效微调是这一追求的前沿技术&#xff0c;它允许研究人员和实践者在最小化计算和资源占用的同时&#xff0c;重复使用预训练模型。这还使我们能够在更广泛的硬件范…

STK 特定问题建模(五)频谱分析(第一部分)

文章目录 简介一、GEO星地通信收发机设计1.1 GEO卫星仿真1.2 地面接收机仿真 二、LEO星座及天线设计 简介 本篇对卫星通信中的频谱利用率、潜在干扰对频谱的影响进行分析&#xff0c;以LEO卫星信号对GEO通信链路影响为例&#xff0c;分析星地链路频谱。 建模将从以下几个部分…

PandoraNext—一个让你呼吸顺畅的ChatGPT

博客地址 PandoraNext—一个让你呼吸顺畅的ChatGPT-雪饼 (xue6ing.cn)https://xue6ing.cn/archives/pandora--yi-ge-rang-ni-hu-xi-shun-chang-de-chatgpt 项目 项目地址 pandora-next/deploy 项目介绍 支持多种登录方式&#xff1a; 账号/密码 Access Token Session To…

基于YOLOv5+单目的物体距离和尺寸测量

目录 1&#xff0c;YOLOv5原理介绍 2,单目测尺寸以及距离原理 2.1单目测物体距离 2.2单目测物体尺寸 3&#xff0c;成果展示 3.3测距离 3.2测尺寸&#xff1a; 1&#xff0c;YOLOv5原理介绍 YOLOv5是目前应用广泛的目标检测算法之一&#xff0c;其主要结构分为两个部分&a…

地理科学数据库近千个网站合集(2024年最新版)

树谷online&#xff0c;还有更多的直接获取的数据 树谷资料库大全&#xff08;2024年1月4日更新&#xff09; 地理科学数据库网站导航收集近1000个相关网站&#xff0c;由刘洪老师&#xff08;成都地质调查中心高级工程师&#xff09;长期维护&#xff0c;定期更新&#xff0…

宏景eHR fileDownLoad SQL注入漏洞复现

0x01 产品简介 宏景eHR人力资源管理软件是一款人力资源管理与数字化应用相融合,满足动态化、协同化、流程化、战略化需求的软件。 0x02 漏洞概述 宏景eHR fileDownLoad 接口处存在SQL注入漏洞,未经过身份认证的远程攻击者可利用此漏洞执行任意SQL指令,从而窃取数据库敏感…

【Linux】通过两台linux主机配置ssh实现互相免密登陆

以下是通过两台Linux主机配置SSH实现互相免密登录的代码及操作流程&#xff1a; node1主机IP&#xff1a;192.168.48.129 server主机IP&#xff1a;192.168.48.130 1、在node1主机上生成密钥对&#xff1a; ssh-keygen -t rsa 2、将node1主机的公钥发送到server主机&#x…

Python 编写不同时间格式的函数

该代码是一个时间相关的功能模块&#xff0c;提供了一些获取当前时间的函数。 Report_time() 函数返回当前时间的格式化字符串&#xff0c;例如 "20240110114512"。Y_M_D_h_m_s_time() 函数返回当前时间的年、月、日、时、分、秒的元组格式。Y_M_D_h_m_s() 函数返回…

乐鑫ESP32与SD NAND的协同应用|MK-米客方德

SD NAND在乐鑫ESP32上的作用 SD NAND是贴片式TF卡&#xff0c;可以用于存储数据&#xff0c;比如视频图片或者代码 乐鑫ESP32一颗具有双核处理器的嵌入式系统芯片&#xff0c;有丰富的外设接口&#xff0c;包括Wi-Fi、蓝牙、UART、SPI、I2C等&#xff0c;使其适用于各种物联网…

Vulnhub靶机:Corrosion1

一、介绍 运行环境&#xff1a;Virtualbox 攻击机&#xff1a;kali&#xff08;10.0.2.15&#xff09; 靶机&#xff1a;corrosion:1&#xff08;10.0.2.12&#xff09; 目标&#xff1a;获取靶机root权限和flag 靶机下载地址&#xff1a;https://www.vulnhub.com/entry/c…

鸿蒙原生应用再添新丁!京东入局鸿蒙

鸿蒙原生应用再添新丁&#xff01;京东入局鸿蒙 来自 HarmonyOS 微博1月10日消息&#xff0c;#京东启动鸿蒙原生应用开发#&#xff01;优惠信息、派送进度都可以随时随地便捷查询。双方将携手为消费者带来全场景“多快好省”购物体验&#xff0c;更智能&#xff0c;更贴心&…

分享两个概念:非受检异常和受检异常

分享两个概念&#xff1a;非受检异常和受检异常 愿你的每一天都充满阳光和笑声&#xff0c;愿每一步都是轻松与愉快。在新的旅程中&#xff0c;愿你找到勇气攀登高峰&#xff0c;找到智慧化解困境。 愿你的心中充满温暖和善意&#xff0c;愿你的梦想如彩虹般美丽且真实。愿你发…

1.10 力扣回溯中等题

93. 复原 IP 地址 代码随想录 (programmercarl.com) 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1"…

SpringBoot:详解Bean装配

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《SpringBoot从官方文档学习》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、IoC容…