文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

shell脚本怎样整合json数值输出从而获取硬件信息

2023-06-05 20:10

关注

shell脚本怎样整合json数值输出从而获取硬件信息,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

查看硬件信息,并将信息整合成json数值,然后传给前段进行分析,最后再进行相应的处理。在装系统的时候,或是进行监控时,都是一个标准的自动化运维流程。使用shell直接生成好json数据再进行传输,会变得非常方便。所以抽时间写了这个小脚本,供大家参考,里面还有很多不完善的地方,有兴趣的朋友可以自行更改

环境

需要安装必要的软件,这里我为了保障脚本合理的进行,使用的是真机环境,没有使用虚拟机

[root@sys-idc-pxe01 ~]# yum install jq lsscsi MegaCliLoaded plugins: fastestmirror, securityLoading mirror speeds from cached hostfileSetting up Install ProcessPackage jq-1.3-2.el6.x86_64 already installed and latest versionPackage lsscsi-0.23-3.el6.x86_64 already installed and latest versionPackage MegaCli-8.00.40-1.i386 already installed and latest versionNothing to do

脚本内容

我的shell风格比较偏向模块化,所以使用函数会多一些,这样方便理解,相信大家也能看得懂。

我不太喜欢python风格的代码格式(虽然我python写的也很不错),看起来给人的感觉太紧凑,太乱。据说是前辈们出版书籍的时候为了省纸,才出现的那种风格,后辈怀着对前辈的敬仰就延续了下来,其实前辈也没有那么写过那种风格的代码,不知道是不是真的。

[root@sys-idc-pxe01 ~]# cat ./get_server_info.sh #!/bin/sh#description: get server hardware info#author: liuxin#date: 20180122#需要安装jq工具 yum install jq#用于存放该服务器的所有信息,个人喜欢把全局变量写到外面#写到函数里面,没有加local的变量也是全局变量INFO="{}"#定义一个工具函数,用于生成json数值,后面将会频繁用到function create_json(){  #utility function  local key=$1  local value="$2"  local json=""  #if value is string  if [ -z "$(echo "$value" |egrep "\[|\]|\{|\}")" ]  then    json=$(jq -n {"$key":"\"$value\""})  #if value is json, object  elif [ "$(echo "$value" |jq -r type)" == "object" ]  then    json=$(jq -n {"$key":"$value"})  #if value is array  elif [ "$(echo "$value" |jq -r type)" == "array" ]  then    json=$(jq -n "{$key:$value}")  else    echo "value type error..."    exit 1    return 0  fi  echo $json  return 0}#获取CPU信息function get_cpu(){  #获取cpu信息,去掉空格和制表符和空行,以便于for循环  local cpu_model_1=$(dmidecode -s processor-version |grep '@' |tr -d " " |tr -s "\n" |tr -d "\t")  local cpu_info="{}"  local i=0  #因为去掉了空格和制表符,以下默认使用换行符分隔  for line in $(echo "$cpu_model_1")  do    local cpu_model="$line"    local cpu1=$(create_json "cpu_model" "$cpu_model")    #获取每块cpu的信息,这里只记录了型号    local cpu=$(create_json "cpu_$i" "$cpu1")    local cpu_info=$(jq -n "$cpu_info + $cpu")    i=$[ $i + 1]  done  #将cpu的信息整合成一个json,key是cpu  local info=$(create_json "cpu" "$cpu_info")  #将信息加入到全局变量中  INFO=$(jq -n "$INFO + $info")  return 0}function get_mem(){  #generate json {Locator:{sn:sn,size:size}}  local mem_info="{}"  #获取每个内存的信息,包括Size:|Locator:|Serial Number:  local mem_info_1=$(dmidecode -t memory |egrep 'Size:|Locator:|Serial Number:' |grep -v 'Bank Locator:' |awk '  {    if (NR%3==1 && $NF=="MB")    {      size=$2;      getline (NR+1);      locator=$2;      getline (NR+2);      sn=$NF;      printf("%s,%s,%s\n",locator,size,sn)    }  }')  #根据上面的信息,将信息过滤并整合成json  local i=0  for line in $(echo "$mem_info_1")  do    local locator=$(echo $line |awk -F , '{print $1}')    local      sn=$(echo $line |awk  -F , '{print $3}')    local    size=$(echo $line |awk -F , '{print $2}')    local mem1=$(create_json "locator" "$locator")    local mem2=$(create_json "sn" "$sn")    local mem3=$(create_json "size" "$size")    local mem4=$(jq -n "$mem1 + $mem2 + $mem3")    #每条内存的信息,key是内存从0开始的序号    local mem=$(create_json "mem_$i" "$mem4")    #将这些内存的信息组合到一个json中    mem_info=$(jq -n "$mem_info + $mem")    i=$[ $i + 1 ]  done  #给这些内存的信息设置key,mem  local info=$(create_json "mem" "$mem_info")  INFO=$(jq -n "$INFO + $info")  return 0}function get_megacli_disk(){  #设置megacli工具的路径,此条可以根据情况更改  local raid_tool="/opt/MegaRAID/MegaCli/MegaCli64"  #将硬盘信息获取,保存下来,省去每次都执行的操作  $raid_tool pdlist aall >/tmp/megacli_pdlist.txt  local disk_info="{}"  #获取硬盘的必要信息  local disk_info_1=$(cat /tmp/megacli_pdlist.txt |egrep 'Enclosure Device ID:|Slot Number:|PD Type:|Raw Size:|Inquiry Data:|Media Type:'|awk '{  if(NR%6==1 && $1$2=="EnclosureDevice")  {    E=$NF;    getline (NR+1);    S=$NF;    getline (NR+2);    pdtype=$NF;    getline (NR+3);    size=$3$4;    getline (NR+4);    sn=$3$4$5$6;    getline (NR+5);    mediatype=$3$4$5$6;    printf("%s,%s,%s,%s,%s,%s\n",E,S,pdtype,size,sn,mediatype)  }}')  #将获取到的硬盘信息进行整合,生成json  local i=0  for line in $(echo $disk_info_1)  do    #local       key=$(echo $line |awk -F , '{printf("ES%s_%s\n",$1,$2)}')    local         E=$(echo $line |awk -F , '{print $1}')    local         S=$(echo $line |awk -F , '{print $2}')    local    pdtype=$(echo $line |awk -F , '{print $3}')    local      size=$(echo $line |awk -F , '{print $4}')    local        sn=$(echo $line |awk -F , '{print $5}')    local mediatype=$(echo $line |awk -F , '{print $6}')    local disk1=$(create_json "pdtype" "$pdtype")    local disk1_1=$(create_json "enclosure_id" "$E")    local disk1_2=$(create_json "slot_id" "$S")    local disk2=$(create_json "size" "$size")    local disk3=$(create_json "sn" "$sn")    local disk4=$(create_json "mediatype" "$mediatype")    local disk5=$(jq -n "$disk1 + $disk1_1 + $disk1_2 + $disk2 + $disk3 + $disk4")    local disk=$(create_json "disk_$i" "$disk5")    disk_info=$(jq -n "$disk_info + $disk")    i=$[ $i + 1 ]  done  #echo $disk_info  local info=$(create_json "disk" "$disk_info")  INFO=$(jq -n "$INFO + $info")  return 0}function get_hba_disk(){  #对于hba卡的硬盘,使用smartctl获取硬盘信息  local disk_tool="smartctl"  local disk_info="{}"  #lsscsi 需要使用yum install lsscsi 安装  local disk_info_1=$(lsscsi -g |grep -v 'enclosu' |awk '{printf("%s,%s,%s,%s\n",$1,$2,$(NF-1),$NF)}')  local i=0  for line in $(echo $disk_info_1)  do    local         E=$(echo $line |awk -F , '{print $1}' |awk -F ':' '{print $1}' |tr -d '\[|\]')    local         S=$(echo $line |awk -F , '{print $NF}' |egrep -o [0-9]*)    local        sd=$(echo $line |awk -F , '{print $(NF-1)}')    $disk_tool -i $sd >/tmp/disk_info.txt    local    pdtype="SATA"    if [ "$(cat /tmp/disk_info.txt |grep 'Transport protocol:' |awk '{print $NF}')" == "SAS" ]    then    local    pdtype="SAS"    fi    local      size=$(cat /tmp/disk_info.txt |grep 'User Capacity:' |awk '{printf("%s%s\n",$(NF-1),$NF)}' |tr -d '\[|\]')    local        sn=$(cat /tmp/disk_info.txt |grep 'Serial Number:' |awk '{print $NF}')    local mediatype="disk"    local disk1=$(create_json "pdtype" "$pdtype")    local disk1_1=$(create_json "enclosure_id" "$E")    local disk1_2=$(create_json "slot_id" "$S")    local disk2=$(create_json "size" "$size")    local disk3=$(create_json "sn" "$sn")    local disk4=$(create_json "mediatype" "$mediatype")    local disk5=$(jq -n "$disk1 + $disk1_1 + $disk1_2 + $disk2 + $disk3 + $disk4")    local disk=$(create_json "disk_$i" "$disk5")    disk_info=$(jq -n "$disk_info + $disk")    i=$[ $i + 1 ]  done  #echo $disk_info  local info=$(create_json "disk" "$disk_info")  INFO=$(jq -n "$INFO + $info")  return 0}function get_disk(){  #根据获取到的硬盘控制器类型,来判断使用什么工具采集硬盘信息  if [ "$(echo "$INFO" |jq -r .disk_ctrl.disk_ctrl_0.type)" == "raid" ]  then    get_megacli_disk  elif [ "$(echo "$INFO" |jq -r .disk_ctrl.disk_ctrl_0.type)" == "hba" ]  then    get_hba_disk  else    local info=$(create_json "disk" "error")    INFO=$(jq -n "$INFO + $info")  fi  #hp机器比较特殊,这里我没有做hp机器硬盘信息采集,有兴趣的朋友可以自行添加上  #if hp machine  return 0}function get_diskController(){  local disk_ctrl="{}"  #if LSI Controller  local disk_ctrl_1="$(lspci -nn |grep LSI)"  local i=0    #以换行符分隔  IFS_OLD=$IFS && IFS=$'\n'  for line in $(echo "$disk_ctrl_1")  do    #echo $line    local   ctrl_id=$(echo "$line" |awk -F ']:' '{print $1}' |awk '{print $NF}' |tr -d '\[|\]')    case "$ctrl_id" in    #根据控制器的id或进行判断是raid卡还是hba卡,因为品牌比较多,后续可以在此处进行扩展添加    0104)      # 获取Logic以后的字符串,并进行拼接      local ctrl_name=$(echo "${line##*"Logic"}" |awk '{printf("%s_%s_%s\n",$1,$2,$3)}')      local     ctrl1=$(create_json "id" "$ctrl_id")      local     ctrl2=$(create_json "type" "raid")      local     ctrl3=$(create_json "name" "$ctrl_name")      ;;    0100|0107)      local ctrl_name=$(echo "${line##*"Logic"}" |awk '{printf("%s_%s_%s\n",$1,$3,$4)}')      local     ctrl1=$(create_json "id" "$ctrl_id")      local     ctrl2=$(create_json "type" "hba")      local     ctrl3=$(create_json "name" "$ctrl_name")      ;;    *)      local     ctrl1=$(create_json "id" "----")      local     ctrl2=$(create_json "type" "----")      local     ctrl3=$(create_json "name" "----")      ;;    esac    local ctrl_tmp=$(jq -n "$ctrl1 + $ctrl2 + $ctrl3")    local ctrl=$(create_json "disk_ctrl_$i" "$ctrl_tmp")    disk_ctrl=$(jq -n "$disk_ctrl + $ctrl")    i=$[ $i + 1 ]  done  IFS=$IFS_OLD  local info=$(create_json "disk_ctrl" "$disk_ctrl")  INFO=$(jq -n "$INFO + $info")  return 0}function get_netcard(){  local netcard_info="{}"  local netcard_info_1="$(lspci -nn |grep Ether)"  local i=0  #echo "$netcard_info_1"  IFS_OLD=$IFS && IFS=$'\n'  for line in $(echo "$netcard_info_1")  do    local     net_id=$(echo $line |egrep -o '[0-9a-z]{4}:[0-9a-z]{4}')    local   net_id_1=$(echo $net_id |awk -F : '{print $1}')    case "$net_id_1" in    8086)      local net_name=$(echo "${line##*": "}" |awk '{printf("%s_%s_%s_%s\n",$1,$3,$4,$5)}')      local     type=$(echo $line |egrep -o SFP || echo "TP")      local     net1=$(create_json "id" "$net_id")      local     net2=$(create_json "name" "$net_name")      local     net3=$(create_json "type" "$type")      ;;    14e4)      local net_name=$(echo "${line##*": "}" |awk '{printf("%s_%s_%s_%s\n",$1,$3,$4,$5)}')      local     type=$(echo $line |egrep -o SFP || echo "TP")      local     net1=$(create_json "id" "$net_id")      local     net2=$(create_json "name" "$net_name")      local     net3=$(create_json "type" "$type")      ;;    *)      local net_name=$(echo "${line##*": "}" |awk '{printf("%s_%s_%s_%s\n",$1,$3,$4,$5)}')      local     type=$(echo $line |egrep -o SFP || echo "TP")      local     net1=$(create_json "id" "$net_id")      local     net2=$(create_json "name" "$net_name")      local     net3=$(create_json "type" "$type")      ;;    esac    local net1=$(jq -n "$net1 + $net2 + $net3")    #echo $net    local net2=$(create_json "net_$i" "$net1")    netcard_info=$(jq -n "$netcard_info + $net2")    i=$[ $i + 1 ]  done  IFS=$IFS_OLD  local info=$(create_json "net" "$netcard_info")  INFO=$(jq -n "$INFO + $info")  return 0}function get_server(){  local product=$(dmidecode -s system-product-name |grep -v '^#' |tr -d ' ' |head -n1)  local manufacturer=$(dmidecode -s system-manufacturer |grep -v '^#' |tr -d ' ' |head -n1)  local server1=$(create_json "manufacturer" "$manufacturer")  local server2=$(create_json "product" "$product")  local server3=$(jq -n "$server1 + $server2")  local info=$(create_json "basic_info" "$server3")  INFO=$(jq -n "$INFO + $info")  return 0}ALL_INFO=""function get_all(){  #因为硬盘信息的获取依赖硬盘控制器的信息,所以get_diskController要放到get_disk前面  get_server  get_cpu  get_mem  get_diskController  get_disk  get_netcard  local sn=$(dmidecode -s system-serial-number |grep -v '^#' |tr -d ' ' |head -n1)  ALL_INFO=$(create_json "$sn" "$INFO")  return 0}function main(){  get_all  echo $ALL_INFO  return 0}#-------------------------------------------------main

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网行业资讯频道,感谢您对编程网的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯