首页 > 编程语言 >python获取服务器基本信息的脚本

python获取服务器基本信息的脚本

时间:2024-03-04 15:55:50浏览次数:22  
标签:脚本 grep python IPMI echo 网卡 print 服务器 CPU

 

之前我发布了批量收集服务器信息脚本,本次更新优化了脚本,对脚本设置了try catch 抛出异常等等,收集信息如下:

ip地址","主机名","序列号","服务器型号","系统盘数量", "系统盘符","系统盘容量","系统盘分区","硬盘列表","硬盘数量","CPU核数", "CPU型号","CPU频率","内存大小","内存条数量","内存型号","系统版本","BIOS模式","内核版本","字符集","软件包数量",'网卡Down','网卡Up',"网卡数量",'网卡10M','网卡100M','网卡1000M','网卡10000M','网卡型号','NUMA开启状态','CPU-NUMA状态','网卡NUMA状态',"服务器IPMI用户数量","IPMI地址","IPMI掩码","IPMI版本

 

 

# 导入paramiko,openpyxl和threading库
import paramiko
import openpyxl
import threading
import xlwt


# 定义一个函数,用于连接远程Linux系统并执行命令
def ssh_exec(ip,cmd):
# 创建SSHClient实例对象
ssh = paramiko.SSHClient()
# 设置自动添加主机密钥
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 连接远程主机
try:
ssh.connect(ip, 22, username='root',password='redhat')
except Exception:
result = ip + " 连接失败!"
# 执行命令并获取输出
stdin, stdout, stderr = ssh.exec_command(cmd)
result = stdout.read().decode()
# 关闭连接
ssh.close()
# 返回结果
return result

# 定义一个函数,用于解析结果,并写入工作表中
def write_info(ws, line):
# 去掉换行符,并用逗号分隔内容
line = line.strip().split(",")
# 获取IP
ip = line[0]
print(f"连接到{ip}...")
row = []
row.append(ip)
try:
result = ssh_exec(ip, cmd)
# 按行分隔结果,并去掉第一行和最后一行(提示信息)
result = result.split("^")[1:-1]
# 定义一个空列表,用于存储解析后的信息
# 遍历每行结果,按冒号分隔内容,并取第二部分作为信息
for r in result:
# info = r.split(",").split()
row.append(r)
# 将这一行写入工作表中
ws.append(row)
except:
row.append("连接失败!")
ws.append(row)

 

# 定义一个命令,用于在远程Linux系统上获取各种信息,包括IP地址、主机名、服务器序列号、
# 服务器型号、硬盘数量、系统盘符、系统分区、硬盘列表、CPU核数、CPU型号、CPU频率、内存大小,
# 内存条数量,内存条参数,系统版本、BIOS模式、内核版本,字符集、软件包数量、Bond状态、网卡型号、
# 服务器IPMI用户数量,IPMI地址,IPMI掩码,IPMI版本,系统网卡状态信息
cmd = """
echo "$(hostname -I)"^
echo "$(hostname)"^
echo "$(dmidecode -s system-serial-number |sed s/[[:space:]]//g)"^
echo "$(dmidecode -s system-product-name)"^
echo "$(lsblk | grep disk | wc -l)"^
echo "$(lsblk -l |grep -i boot -B 1 |grep -i disk |awk ' {print $1}' )"^
echo "$(i=`lsblk | grep -w '/' |cut -c 3-5` && lsblk |grep $i | awk 'NR==1 {print $4}')"^
echo "$(lsblk -f | grep / | awk '{print $1}')"^
echo "$(lsblk -a)"^
echo "$(lsblk | grep disk | wc -l)"^

echo "$(nproc)"核^
echo "$(cat /proc/cpuinfo | grep 'model name' | uniq | cut -d ':' -f 2)"^
echo "$(lscpu | grep 'CPU MHz' | awk '{print $3}') MHz"^
echo "$(free -h | grep Mem | awk '{print $2}')"^
echo "$(dmidecode -t memory | grep Size: | grep 'MB\|GB' | wc -l)"^
echo "$(dmidecode -t memory | grep -i 'Part Number' | grep -v 'NO DIMM'|awk '{print $3}')"^
echo "$(cat /etc/system-release)"^
echo "$(ls /sys/firmware/efi/efivars > /dev/null 2>&1 && echo UEFI || echo Legacy)"^
echo "$(uname -r)"^
echo "$(locale charmap)"^
echo "$(rpm -qa | wc -l)"^
echo "$(for i in `ls /sys/class/net/ | grep 'ens\|enp\|eth'`; do ethtool $i|grep Speed|grep Unk >>/dev/null&&echo $i; done;)"^
echo "$(ip addr | grep UP | grep 'ens\|enp\|eth\|bond' | awk -F : '{print $2}')"^
echo "$(for i in `ls /sys/class/net/ | grep 'ens\|enp\|eth'`; do echo $i `cat /sys/class/net/$i/device/numa_node` | awk -F " " '{print $1}'; done;)"^
echo "$(for i in `ls /sys/class/net/ | grep 'ens\|enp\|eth'`; do ethtool $i|grep Speed|grep 10M >>/dev/null&&echo $i; done;)"^
echo "$(for i in `ls /sys/class/net/ | grep 'ens\|enp\|eth'`; do ethtool $i|grep Speed|grep 100M >>/dev/null&&echo $i; done;)"^
echo "$(for i in `ls /sys/class/net/ | grep 'ens\|enp\|eth'`; do ethtool $i|grep Speed|grep 1000M >>/dev/null&&echo $i; done;)"^
echo "$(for i in `ls /sys/class/net/ | grep 'ens\|enp\|eth'`; do ethtool $i|grep Speed|grep 10000M >>/dev/null&&echo $i; done;)"^
echo "$(lspci | grep Ethernet | awk -F : '{print $3}')"^
echo "$(dmesg | grep -i numa | grep 'No NUMA configuration found')"^
echo "$(lscpu |grep 'NUMA')"^
echo "$(for i in `ls /sys/class/net/ | grep e`; do echo $i `cat /sys/class/net/$i/device/numa_node`; done;)"^

echo "$(ipmitool user list 1 | wc -l)"^
echo "$(ipmitool lan print 1 | grep 'IP Address')"^
echo "$(ipmitool lan print 1 | grep 'Subnet Mask')"^

echo "$(ipmitool mc info | grep 'Firmware Revision')"^
echo "$(ip a)^
"""

# 定义一个文件名,存储要连接的Linux系统的信息,包括IP,用户名,密码,每行一个,用逗号分隔
filename = "linux_list.txt"

# 打开文件,并按行读取内容
with open(filename) as f:
lines = f.readlines()

# 创建一个excel工作簿对象
wb = openpyxl.Workbook()
# 获取当前活动的工作表对象
ws = wb.active
# 设置工作表的标题为"服务器信息"
ws.title = "服务器信息"
# "ip地址","主机名","序列号","服务器型号","系统盘数量",
# "系统盘符","系统盘容量","系统盘分区","硬盘列表","硬盘数量","CPU核数",
# "CPU型号","CPU频率","内存大小","内存条数量","内存型号",
# "系统版本","BIOS模式","内核版本","字符集","软件包数量",'网卡Down','网卡Up',"网卡数量",
#'网卡10M','网卡100M','网卡1000M','网卡10000M','网卡型号','NUMA开启状态','CPU-NUMA状态','网卡NUMA状态',
#"服务器IPMI用户数量","IPMI地址","IPMI掩码","IPMI版本"


ws.append(["ip地址","主机名","序列号","服务器型号","系统盘数量",
"系统盘符","系统盘容量","系统盘分区","硬盘列表","硬盘数量","CPU核数",
"CPU型号","CPU频率","内存大小","内存条数量","内存型号",
"系统版本","BIOS模式","内核版本","字符集","软件包数量",'网卡Down','网卡Up',"网卡数量",
'网卡10M','网卡100M','网卡1000M','网卡10000M','网卡型号','NUMA开启状态','CPU-NUMA状态','网卡NUMA状态',
"服务器IPMI用户数量","IPMI地址","IPMI掩码","IPMI版本"])


for i, val in enumerate(ws):
ws.write(0, i, label=val, style=ws)
first_col = ws.col(i)
first_col.width = 180 * 20

 

# 定义一个空列表,用于存储线程对象
threads = []

# 遍历每行内容,创建一个线程对象,并将其添加到列表中
for line in lines:
t = threading.Thread(target=write_info, args=(ws, line))
threads.append(t)

# 遍历线程列表,启动每个线程
for t in threads:
t.start()

# 遍历线程列表,等待每个线程结束
for t in threads:
t.join()

# 保存工作簿为"server_info.xlsx"
wb.save("server_info.xlsx")

结果:

 

标签:脚本,grep,python,IPMI,echo,网卡,print,服务器,CPU
From: https://www.cnblogs.com/cherishthepresent/p/18051966

相关文章

  • 利用python的http.server定制自己的页面和响应
    pythonhttp.server简介pythonhttp.server是一个简单的基础的httpserver,默认查找网站根目录的index.html文件,如果没有index.html文件,则放回网站根目录文件视图这里我们想对http.server进行修改,实现我们特定的需求,如果只变化html确实能展现不能的静态页面,但是没有办法进行交互,如......
  • python -- 解决安装pyxll-jupyter时出现“TimeoutError: The read operation timed ou
     在cmd输入命令”pipinstallpyxll-jupyter“进行安装,控制台出现以下报错信息:Downloadingpyxll_jupyter-0.5.2-py3-none-any.whl(46kB)----------------------------------------46.3/46.3kB16.1kB/seta0:00:00Downloadingjupyter-1.0.0-py2.py3-none-any.whl......
  • Python-数值类型
    数值类型1.内置数值工具内置数学函数:pow:计算幂abs:计算绝对值sum:求和round:向上取整(四舍五入)max:求最大值min:求最小值>>>pow(2,4),2**4,2.0**4.0(16,16,16.0)>>>abs(-42.0),sum((1,2,3,4))(42.0,10)>>>min((1,2,3,4)),max((1,2,3,4))......
  • python hashlib模块详解
    hashlib是python自带的加密模块,提供了一些基础常用的加密方式,如:md5(),sha1(),sha224(),sha256(),sha384(),sha512(),blake2b(),blake2s() Hash对象提供了4个方法: --update(data):更新hash对象的字节数据,data是需要加密的文本内容,需要转为bytes类型,如果”abc123”.en......
  • JVisualVM连接远程服务器
    要使用JVisualVM连接远程服务器,你需要在远程服务器上配置JVM以允许JVisualVM进行远程连接,然后在本地JVisualVM中添加远程主机。以下是连接远程服务器的步骤:远程服务器配置配置JVM启动参数:在启动Java应用程序时,需要添加一些JVM参数来启用远程监控。例如,使用以下参数启动应用程......
  • 教你用Ubuntu快速搭建饥荒服务器
    本文分享自华为云社区《Ubuntu快速搭建饥荒服务器》,作者:云计算冲锋队。《饥荒》是Klei第一次尝试生存题材。受到Minecraft 的影响,这个游戏也是将玩家放置到游戏世界中,并未给予玩家太多的指示以及特定的生存目标。该游戏在游戏评论家受普遍好评,包括其美术风格、音乐以及玩家死亡......
  • 详解Python中sys模块的功能与应用
    本文分享自华为云社区《深入Python:sys模块的功能与应用详解》,作者:柠檬味拥抱。在Python的标准库中,sys 模块是一个常用而强大的工具,它提供了与Python解释器交互的函数和变量。本文将介绍sys模块的一些常用函数和方法,并通过实际的代码实例来解析它们的用法。1.sys.argv-命令......
  • Python实现snap:对齐多张遥感影像的空间范围
      本文介绍基于Python中ArcPy模块,实现基于栅格图像批量裁剪栅格图像,同时对齐各个栅格图像的空间范围,统一其各自行数与列数的方法。  首先明确一下我们的需求。现有某一地区的多张栅格遥感影像,其虽然都大致对应着同样的地物范围,但不同栅格影像之间的空间范围、行数与列数、像......
  • python之为函数执行设置超时时间(允许函数执行的最大时间)
    1、背景    通常我们在自定义一个函数后,会调用这个函数来完成我们想要的功能。  就拿爬虫来举例,发送请求后服务器会在指定时间内响应(通常这个时间很短),但是有可能服务器没有返回任何数据。  无论是服务器已经识别爬虫不予返回数据亦或者是服务器繁忙等其他原因,......
  • PowerShell 中,您可以通过远程控制执行多条命令。最常见的方法是使用 Invoke-Command
    PowerShell中,您可以通过远程控制执行多条命令。最常见的方法是使用Invoke-Command命令,它允许您在远程计算机上执行指定的命令或脚本块。以下是一种执行多条命令的示例:powershellCopyCodeInvoke-Command-ComputerName"远程计算机名"-ScriptBlock{#在这里可以放置要......