脚本介绍:
脚本功能:用户通过输入系统信息具体对应的字符的选择项来查看该虚拟机对应的硬件信息与服务器的部分服务启动情况。
本脚实现的功能主要是根据操作者输入对应的字符选项来显示选项相应的内容,既显示在窗口也在对应的文件夹下生成带有具体时间的log(具体时间到秒,防止覆盖),方便后续的查询。
具体操作:
1、启动脚本后,给用户一个选择,是继续还是退出程序。
2.1、当用户选择2时,即退出脚本。(防止用户误操作)
2.2、当用户选择1时,即进入选择,选择想要显示虚拟机相应的信息(在输入信息的上一行,显示了缩写字符对应的具体信息,用户可参考这个信息并根据需求做出相应的选择。).
一、脚本功能演示
实例一、查看系统信息
(1) 、当用户输入system的对应字符“s”即查询系统信息,会立即在窗口显示查询的结果,并将结果生成对应的log文件,方便后续的查询。当信息显示完选择项相对应的数据内容后,又返回到最初的用户交互界面,是继续进行查询还是退出程序。
(2) 在指定的文件位置生成指定类型的log文件。
指定文件格式为:指定位置/文件类型_info_log_时间(具体到秒,防止再次执行后覆盖).log
即
刚刚执行程序查看系统信息后生成的log文件
查看生成的log内容,与查询时窗口显示的信息内容一直(可自行与前面的进行比较).
示例二:查询linux服务器的服务(WWW, SSH, FTP and Mail)是否启动。
(1)、启动result_new.sh脚本进入交互选择进入信息的界面,输入d来查询服务是否启动
(2)在指定位置查看生成的log
二、脚本功能实现的关键代码
1、解释说明代码实现的功能,方便后期查看、维护与扩展。
2、主要环境变量的宣告
3、声明元素变量与创建时间变量
4、使用函数,用对应功能的名称来命名。
1)、查看系统信息的函数
2) 、查看CPU信息的函数
3) 、内存信息查看
4) 、查看硬盘信息与分区信息
5) 、查看服务器的部分服务启动情况
6) 、通过启动start_script这个函数来实现通过用户输入功能的代表字符来调用对应的函数。
7) 、询问用户是否程序是否进入下一步,“1”代表继续执行程序,“2”代表退出程序。使用while判断,使while的执行条件一直为true,当用户查询一个信息之后,用户有可能会再次查询其他信息,故不能程序自动结束退出。当用户查询完成后,可以自己选择输入“2”来进行程序的退出。
注释:此是在linux下的运行结果,Mac上的文件配置与linux的配置不一样。如果要用在Mac上需要进行修改。
下面为整个完整的shell脚本代码:
#!/bin/bash #File : result.sh #Version: #Copyright:2018_4 #Description: #Author:rabbit #Change History:
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH
#All information about linux information go into the "/root/shell/linux/..." folder #so if it doesn't exit, creat it. S_DIR=/root/shell/linux/linux_log/system_info C_DIR=/root/shell/linux/linux_log/cpu_info M_DIR=/root/shell/linux/linux_log/memory_info P_DIR=/root/shell/linux/linux_log/partitions_info D_DIR=/root/shell/linux/linux_log/detect_services W_DIR=/root/shell/linux/linux_log/software_info A_DIR=/root/shell/linux/linux_log/all
# creat time for creat log DATE=`date +%Y%m%d%H%M%S`
#system info system_info(){ echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" echo "system info:" echo " System-release(发行版本):`cat /etc/centos-release`" echo " Kernel-release(内核版本):`uname -a|awk '{print $1,$3}'`" echo " Server-Model(服务器模型):`dmidecode |grep "Product Name:" |sed -n "1p" |awk '{print $1,$3}'`" echo }
#CPU info cpu_info(){ echo " Frequency(型号名称):`cat /proc/cpuinfo |grep "model name" |uniq |awk -F':' '{print $2}'`" echo " CPU cores(CPU核心):`cat /proc/cpuinfo |grep "cpu cores" |uniq |awk -F':' '{print $2}'`" echo " Logic count(逻辑处理器个数):`cat /proc/cpuinfo |grep "processor" |sort -u |wc -l`" echo " Physical(物理计数):`cat /proc/cpuinfo |grep "physical" |sort -u |wc -l`" echo " Cache size(缓存大小):`cat /proc/cpuinfo |grep "cache size" |uniq |awk '{print $4,$5}'`" echo }
#memory info memory_info(){ memory=`dmidecode |grep "Range Size" |head -1 |awk '{print $3,$4}'` mem_size=`echo "This server has ${memory} memory."` echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" echo "Memory info:" echo "Memory size(内存大小):${mem_size}" echo "Memory Device Count(内存槽位):`dmidecode |grep -A16 "Memory Device$" |grep "Size" |awk '{if($2!~/No/) print $0}' |wc -l`" }
#disk and partitions partitions_info(){ swap_pos=`cat /proc/swaps |sed -n '2p' |awk '{print $1}'` echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" echo "Hard disk info(硬盘信息):" echo "`fdisk -l |grep Disk |awk -F, '{print $1}'`" echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" echo "Partition info(分区信息):" echo "`df -h |grep -v Filesystem |sed "s:none:${swqp_pos}:"`" }
#detect linux server's services(WWW, SSH, FTP, MAIL) detect_services(){ echo "`netstat -tuln`" >> /root/shell/linux/result.txt echo "Now, I will detect linux server's services!" echo -e "The www, ftp, ssh, and mail(smtp) will betect! \n" testfile=/root/shell/linux/result.txt testing=$(grep ':80' ${testfile}) if [ "${testing}" != "" ]; then echo "WWW is running in your system." else echo "WWW is stop in your system." fi testing=$(grep ':22' ${testfile}) if [ "${testing}" != "" ]; then echo "SSH is running in your system." else echo "SSH is stop in your system." fi testing=$(grep ':21' ${testfile}) if [ "${testing}" != "" ]; then echo "FTP is running in your system." else echo "FTP is stop in your system." fi testing=$(grep ':25' ${testfile}) if [ "${testing}" != "" ]; then echo "Mail is running in your system." else echo "Mail is stop in your system." fi }
#software package software_info(){ echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" echo "SELinux is `cat /etc/selinux/config |grep SELINUX=disabled|awk -F= '{print $2}'||echo "enabled"`" echo "`service iptables status |sed 's/Firewall/Iptables/g'`" echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" sed -n '/%packages/,/%post/p;' /root/anaconda-ks.cfg |sed '/%post/d;/^s/d' echo "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" }
#content start_script(){ echo "This program will print your selection !" echo "s=system, c=cpu, m=memory, p=partition, d=detect-services, w=software" read -p "Input your choice[s,c,m,p,d,w,all]: " choice case ${choice} in "s") system_info if [ ! -d "${S_DIR}" ]; then mkdir -p "${S_DIR}" fi system_info >> ${S_DIR}/system_info_log_${DATE}.log echo "****************************************" ;; "c") cpu_info if [ ! -d "${C_DIR}" ]; then mkdir -p "${C_DIR}" fi cpu_info >> ${C_DIR}/cpu_info_log_${DATE}.log echo "****************************************" ;; "m") memory_info if [ ! -d "${M_DIR}" ]; then mkdir -p "${M_DIR}" fi memory_info >> ${M_DIR}/memory_info_log_${DATE}.log echo "****************************************" ;; "p") partitions_info if [ ! -d "${P_DIR}" ]; then mkdir -p "${P_DIR}" fi partitions_info >> ${P_DIR}/partitions_info_log_${DATE}.log echo "****************************************" ;; "d") detect_services if [ ! -d "${D_DIR}" ]; then mkdir -p "${D_DIR}" fi detect_services >> ${D_DIR}/detect_services_log_${DATE}.log echo "****************************************" ;; "w") software_info if [ ! -d "${W_DIR}" ]; then mkdir -p "${W_DIR}" fi software_info >> ${W_DIR}/software_info_log_${DATE}.log ;; "all") system_info cpu_info memory_info partitions_info detect_services software_info if [ ! -d "${A_DIR}" ]; then mkdir -p "${A_DIR}" fi system_info >> ${A_DIR}/all__log_${DATE}.log cpu_info >> ${A_DIR}/all__log_${DATE}.log memory_info >> ${A_DIR}/all__log_${DATE}.log partitions_info >> ${A_DIR}/all__log_${DATE}.log detect_services >> ${A_DIR}/all__log_${DATE}.log software_info >> ${A_DIR}/all__log_${DATE}.log echo "****************************************" ;; *) echo "Usage ${0} {s,c,m,p,d,w}" echo "****************************************" ;; esac }
while [ true ] do echo "Please you chioce that what you want know!" echo "1 ==> start scripts 2 ==> exit" read -p "Please input you chioce(1,2): " input case ${input} in "1") start_script ;; "2") echo "goodbye!!!" exit 1 ;; *) echo "Usage chioce just "1" or "2" !!!" ;; esac done |