溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

怎么用shell腳本整合json數(shù)值獲取硬件信息

發(fā)布時間:2022-02-08 09:44:45 來源:億速云 閱讀:135 作者:iii 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“怎么用shell腳本整合json數(shù)值獲取硬件信息”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“怎么用shell腳本整合json數(shù)值獲取硬件信息”吧!

環(huán)境

需要安裝必要的軟件,這里我為了保障腳本合理的進行,使用的是真機環(huán)境,沒有使用虛擬機

[root@sys-idc-pxe01 ~]# yum install jq lsscsi MegaCliLoaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
Setting up Install Process
Package jq-1.3-2.el6.x86_64 already installed and latest version
Package lsscsi-0.23-3.el6.x86_64 already installed and latest version
Package MegaCli-8.00.40-1.i386 already installed and latest version
Nothing to do

腳本內(nèi)容

我的shell風(fēng)格比較偏向模塊化,所以使用函數(shù)會多一些,這樣方便理解,相信大家也能看得懂。

我不太喜歡python風(fēng)格的代碼格式(雖然我python寫的也很不錯),看起來給人的感覺太緊湊,太亂。據(jù)說是前輩們出版書籍的時候為了省紙,才出現(xiàn)的那種風(fēng)格,后輩懷著對前輩的敬仰就延續(xù)了下來,其實前輩也沒有那么寫過那種風(fēng)格的代碼,不知道是不是真的。

[root@sys-idc-pxe01 ~]# cat ./get_server_info.sh#!/bin/sh#description: get server hardware info#author: liuxin#date: 20180122#需要安裝jq工具 yum install jq#用于存放該服務(wù)器的所有信息,個人喜歡把全局變量寫到外面#寫到函數(shù)里面,沒有加local的變量也是全局變量INFO="{}"#定義一個工具函數(shù),用于生成json數(shù)值,后面將會頻繁用到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循環(huán) 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="{}" #獲取每個內(nèi)存的信息,包括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)
   }
 }')

 #根據(jù)上面的信息,將信息過濾并整合成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")
   #每條內(nèi)存的信息,key是內(nèi)存從0開始的序號   local mem=$(create_json "mem_$i" "$mem4")
   #將這些內(nèi)存的信息組合到一個json中   mem_info=$(jq -n "$mem_info + $mem")
   i=$[ $i + 1 ]
 done #給這些內(nèi)存的信息設(shè)置key,mem local info=$(create_json "mem" "$mem_info")
 INFO=$(jq -n "$INFO + $info")

 return 0
}function get_megacli_disk()
{
 #設(shè)置megacli工具的路徑,此條可以根據(jù)情況更改 local raid_tool="/opt/MegaRAID/MegaCli/MegaCli64" #將硬盤信息獲取,保存下來,省去每次都執(zhí)行的操作 $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()
{
 #根據(jù)獲取到的硬盤控制器類型,來判斷使用什么工具采集硬盤信息 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   #根據(jù)控制器的id或進行判斷是raid卡還是hba卡,因為品牌比較多,后續(xù)可以在此處進行擴展添加   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

到此,相信大家對“怎么用shell腳本整合json數(shù)值獲取硬件信息”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI