60天shell脚本计划-5/12-渐入佳境

--作者:飞翔的小胖猪

--创建时间:2021年2月16日

--修改时间:2021年2月20日

说明

 每日上传更新一个shell脚本,周期为60天。如有需求的读者可根据自己实际情况选用合适的脚本,也可在评论区留言提出脚本需求,作者会尽快根据需求编写相关脚本对功能进行实现。

 每篇文章包含5个脚本。

总进度:5/12

上一篇脚本链接:https://www.cnblogs.com/Pigs-Will-Fly/p/14399775.html

下一篇脚本链接:https://www.cnblogs.com/Pigs-Will-Fly/p/14415847.html

主要内容

21年2月16日-mysql连接脚本

************************************************************************************************************************************************************************************************************************************

脚本说明

mysql连接脚本,在脚本中键入指定的sql执行。好像没有实质性的用处。

文件说明

Mysql_driver.sh:脚本主体文件

脚本主体

[root@135 21_Mysql_driver]# cat Mysql_driver.sh 
#!/bin/bash
#定义变量数据相关参数,其他的函数需要使用时直接从这里获取。
connect_db(){
  IP=${IP:-127.0.0.1}
  PORT=${PORT:-3306}
  USERNAME=${USERNAME:-test21}
  PASSWORD=${PASSWORD:-123456}
  DBNAME=${DBNAME:-test_db}
  echo -e  "DB connection parameters>> \n    HOSTNAME: $IP \n    PORT: $PORT \n    USERNAME: $USERNAME \n    PASSWORD: $PASSWORD \n    DB_NAME: $DBNAME"
}

#测试数据库是否能够连接。
test_connection_status(){
  mysql -h${IP} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e"show tables;"  &>/dev/null
  return $?
}

#执行语句函数
edit_data(){
  sql_language=${1:- }
  echo "sql执行语言为:$sql_language "  
  mysql -h${IP} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e"${sql_language};" 
  if [ $? -eq 0 ];then
    echo "Command executed successfully。"
  else
    echo "Command execution failed!"
  fi
}

#主函数
main(){
  #输入数据连接参数
  IP="127.0.0.1"
  PORT="3306"
  USERNAME="test21"
  PASSWORD="123456"
  DBNAME="test_db"
  
  #需要执行的sql语句,通过执行时传入,如果为传入则查看所有的表名
  sql_l='select * from t1;'
  
  connect_db
  test_connection_status
  sql_l_f=`echo "${sql_l} commit;"`

  if test_connection_status;then
    echo "数据库连接成功,可以执行命令。"
    edit_data "${sql_l_f}"
  else
    echo -e "数据库连接失败!!!\nCase:\n    1.请检查连接参数是否正确。\n    2.数据库连接设置是否正确。"
  fi
}

main

结果

**************************************************************************************************************2021年2月16日脚本结束*****************************************************************************************************************

 

21年2月17日-显示love脚本

************************************************************************************************************************************************************************************************************************************

脚本说明

循环显示 i love字母。

文件说明

display_love.sh:脚本主体文件

脚本主体

[root@135 22_i_love_you]# cat display_love.sh 
#!/bin/bash
trap 'onCtrlC' INT
# 显示LOVE
love1(){
  echo ""
  echo " ####         "
  echo "  ##          "
  echo "  ##          "
  echo "  ##          "
  echo "  ##          "
  echo "  ##          "
  echo "  ##          "
  echo "  ##          "
  echo "  ##          "
  echo " ####         "
}

love2(){
  echo ""
  echo "##       "
  echo "##       "
  echo "##       "
  echo "##       "
  echo "##       "
  echo "##       "
  echo "##       "
  echo "##       "  
  echo "#########"
  echo "######## "
}

love3(){
  echo ""
  echo "    ######    "
  echo "   ########   "
  echo "  ###    ###  "
  echo " ###      ### "
  echo " ###      ### "
  echo " ###      ### "
  echo " ###      ### "
  echo "  ###    ###  "
  echo "   ########   "
  echo "    ######    "
}

love4(){
  echo ""
  echo "##           ##"
  echo "##           ##"
  echo "##           ##"
  echo " ##         ## "
  echo "  ##       ##  "
  echo "   ##     ##   "
  echo "    ##   ##    "
  echo "     ## ##     "
  echo "      ###      "
  echo "       #       "
}


love5(){
  echo ""
  echo " #############"
  echo " ############"
  echo " ##"
  echo " ##"
  echo " ###########"
  echo " ###########"
  echo " ##"
  echo " ##"
  echo " ###########"  
  echo " #############"
}

display_love(){
  clear
  while :
  do
    for i in {1..5}
    do
      love${i}
      love${i} > love${i}
      sleep 0.5
      clear
    done
    sleep 0.7
    paste love1 love2 love3 love4 love5
    sleep 2
    rm -rf love1 love2 love3 love4 love5
    clear
  done
}

#捕获ctrl+c执行删除临时文件。
onCtrlC(){
  rm -rf love1 love2 love3 love4 love5 &>/dev/null
  exit 99
}

display_love

结果

**************************************************************************************************************2021年2月17日脚本结束*****************************************************************************************************************

21年2月18日-echo显示hello word

************************************************************************************************************************************************************************************************************************************

脚本说明

使用echo的定位符来回显示“hello,word!”这句话。

文件说明

advanced_echo.sh:脚本主体文件

脚本主体

[root@135 23_advanced_echo]# cat advanced_echo.sh 
#!/bin/bash
clear
hello=("H" "e" "l" "l" "o" "," "W" "o" "r" "d" "!")
arr_len=${#hello[*]}
while :
do
  for((i=0;i<$arr_len;i++))
  do
    let j=$i+3
    echo -e  "\033[5;${j}H${hello[i]}"
    sleep 0.2
  done
  clear
  for((i=$arr_len;i>=0;i--))
  do
    let j=$i+3
    echo -e  "\033[5;${j}H${hello[i]}"
    sleep 0.2
  done
  clear 
done

结果

 

 

 

**************************************************************************************************************2021年2月18日脚本结束*****************************************************************************************************************

 

21年2月19日-系统网络接口流量脚本

************************************************************************************************************************************************************************************************************************************

脚本说明

脚本提取/proc/net/dev文件内容计算出系统中网卡流量信息,接口数据流量大小,错误包个数等。

文件说明

net_info.sh:脚本主体文件

脚本主体

[root@135 24_net_info]# cat net_info.sh 
#!/bin/bash
#网络流量信息
#通过两次读取/proc/net/dev文件,间隔一秒,导出1秒的网卡流量数据。
net_info(){
  echo -e "-------------Net------------\n"
   
  #获取网口名  
  net_dict=`awk '$1!~/lo/{if(NR>2)print $1}' /proc/net/dev|sed 's/\://g'`

  #截取两个数据间隔时间为1秒
  net_info_old=`awk '$1!~/lo/{if(NR>2)print}' /proc/net/dev`
  #设置文件提取信息间隔为1秒
  sleep 1
  net_info_new=`awk '$1!~/lo/{if(NR>2)print}' /proc/net/dev`
  

  echo -e "New:  \n$net_info_new\n"
  echo -e "Old:  \n$net_info_old\n"


  echo "$net_dict"| while read dev_name
  do
    rx_old=`echo "$net_info_old"|grep $dev_name|awk '{printf $2}'`
    rx_new=`echo "$net_info_new"|grep $dev_name|awk '{printf $2}'`
    rx_old_p=`echo "$net_info_old"|grep $dev_name|awk '{printf $3}'`
    rx_new_p=`echo "$net_info_new"|grep $dev_name|awk '{printf $3}'`
    rx_old_e=`echo "$net_info_old"|grep $dev_name|awk '{printf $4}'`
    rx_new_e=`echo "$net_info_new"|grep $dev_name|awk '{printf $4}'`
    
    tx_old=`echo "$net_info_old"|grep $dev_name|awk '{printf $10}'`
    tx_new=`echo "$net_info_new"|grep $dev_name|awk '{printf $10}'`
    tx_old_p=`echo "$net_info_old"|grep $dev_name|awk '{printf $11}'`
    tx_new_p=`echo "$net_info_new"|grep $dev_name|awk '{printf $11}'`
    tx_old_e=`echo "$net_info_old"|grep $dev_name|awk '{printf $13}'`
    tx_new_e=`echo "$net_info_new"|grep $dev_name|awk '{printf $13}'`

    rx=$((${rx_new}-${rx_old}))
    rx_p=$((${rx_new_p}-${rx_old_p}))
    rx_e=$((${rx_old_e}-${rx_new_e}))

    tx=$((${tx_new}-${tx_old}))
    tx_p=$((${tx_new_p}-${tx_old_p}))
    tx_e=$((${tx_old_e}-${tx_new_e}))

    #echo "$rx"
    #echo "$rx_p"
    echo -e "Net_name: $dev_name"
    echo -e "    收流量/B:  $rx\n    收包数/个:  $rx_p\n    收错误包/个:  $rx_e\n    发流量/B:  $tx\n    发包数/个:  $tx_p\n    发包错误数/个:  $tx_e\n"

  done
   

}

main(){
  net_info
}

main

结果

**************************************************************************************************************2021年2月19日脚本结束*****************************************************************************************************************

21年2月20日-系统监控脚本(详细版)

************************************************************************************************************************************************************************************************************************************

脚本说明

脚本通过8个函数获取当前操作系统的性能数据,包括cpu、内存、磁盘io、网络流量、进程信息、端口及打开文件限制、系统基本信息、文件md5值比对。

脚本只对使用比较广泛的数据进行采集,如果需要更详细的数据各位看官可在对应的函数中进行代码增减。

文件说明

performance_info.sh:脚本主体文件

脚本主体

[root@135 25_cpu_info]# cat performance_info.sh 
#!/bin/bash
#cpu信息
cpu_info(){
  Cpu_Num=`nproc`   #获取逻辑CPU的个数
  Avage_five_cpu=`uptime  | sed 's/.*load average: //g'   | sed 's#\,##g'|awk '{print $2}'` #采集5分钟CPU负载情况
  let Used_rate_cpu=100-`vmstat 1 2 |awk '{if(NR>3){printf $(NF-2) }}'`   #cpu使用率
  CPU_queue_depth=`vmstat 1 2 |awk '{if(NR>3){printf $1}}'` #cpu队列深度
  
  #cpu信息总输出 
  echo -e "-------------CPU------------\n"
  echo -e  "Cpu_num:  ${Cpu_Num:-null}\nCpu five avage:  ${Avage_five_cpu:-null}\nCPU_rate:  ${Used_rate_cpu:-null}\nCPU_queue:  ${CPU_queue_depth:-null}\n"
}

#内存信息
mem_info(){
  all_mem_info=`awk '/^MemTotal|^MemFree|^SwapTotal|^SwapFree|^Buffers|^Cached/{print}' /proc/meminfo`
  
  total_mem=`echo "$all_mem_info"|awk '/MemTotal/{printf ("%d\n",$2/1024)}'`
  free_mem=`echo "$all_mem_info"|awk '/MemFree/{printf ("%d\n",$2/1024)}'`
  total_swap=`echo "$all_mem_info"|awk '/SwapTotal/{printf ("%d\n",$2/1024)}'`
  free_swap=`echo "$all_mem_info"|awk '/SwapFree/{printf ("%d\n",$2/1024)}'`
  buffer=`echo "$all_mem_info"|awk '/Buffers/{printf ("%d\n",$2/1024)}'`
  cached=`echo "$all_mem_info"|awk '/Cached/{printf ("%d\n",$2/1024)}'`
  swappiness=`cat /proc/sys/vm/swappiness `
   
  #内存信息总输出
  echo -e "-------------Mem------------\n"
  echo -e "Swappiness:  ${swappiness:-null}"
  echo -e "Total_Mem:  ${total_mem:-null}MB\nFree_mem:  ${free_mem:-null}MB\nTotal_swap:  ${total_swap:-null}MB\nFree_mem:  ${free_swap:-null}MB\nBuffers:  ${buffer:-null}MB\nCached:  ${cached:-null}MB\n"
}

#磁盘IO信息
io_info(){
  #不适用于rhel8以上的版本
  disk_num=`iostat -dxy 1 1 |awk '$1~/[svx]d[a-z]$/'|wc -l`
  io_info=`iostat -dxy 1 1 |awk '$1~/[svx]d[a-z]$/'`

  #echo "$io_info" |while read  dev_name  r_s  w_s     rkB_s     wkB_s   rrqm_s   wrqm_s  rrqm  wrqm r_await w_await aqu_sz rareq_sz wareq_sz  svctm  util
  echo -e "-------------I/O------------\n"
  echo "$io_info" |while read  dev_name  line
  do
    echo -e "Dev_name: $dev_name"
    iops=`echo "$line" | awk '{printf ("%f\n",$1+$2)}'`
    rbps=`echo "$line" | awk '{printf ("%f\n",$3/1024)}'`
    wbps=`echo "$line" | awk '{printf ("%f\n",$4/1024)}'`
    rwbps=`echo "$line" | awk '{printf ("%f\n",($3+$4)/1024)}'`
    util=`echo "$line" | awk '{printf ("%f\n",$NF)}'`    
    
    #磁盘信息总输出
    echo -e "    iops:  $iops\n    r/bps:  $rbps\n    r/bps:  $wbps\n    吞吐量:  $rwbps\n    响应时间:  ${util}\n"
  done
}

#网络流量信息
net_info(){
  echo -e "-------------Net------------\n"
   
  #获取网口名  
  net_dict=`awk '$1!~/lo/{if(NR>2)print $1}' /proc/net/dev|sed 's/\://g'`

  #截取两个数据间隔时间为1秒
  net_info_old=`awk '$1!~/lo/{if(NR>2)print}' /proc/net/dev`
  sleep 2
  net_info_new=`awk '$1!~/lo/{if(NR>2)print}' /proc/net/dev`
  
  echo -e "New:  \n$net_info_new"
  echo -e "Old:  \n$net_info_old"

  echo "$net_dict"| while read dev_name
  do
    rx_old=`echo "$net_info_old"|grep $dev_name|awk '{printf $2}'`
    rx_new=`echo "$net_info_new"|grep $dev_name|awk '{printf $2}'`
    rx_old_p=`echo "$net_info_old"|grep $dev_name|awk '{printf $3}'`
    rx_new_p=`echo "$net_info_new"|grep $dev_name|awk '{printf $3}'`
    rx_old_e=`echo "$net_info_old"|grep $dev_name|awk '{printf $4}'`
    rx_new_e=`echo "$net_info_new"|grep $dev_name|awk '{printf $4}'`
    
    tx_old=`echo "$net_info_old"|grep $dev_name|awk '{printf $10}'`
    tx_new=`echo "$net_info_new"|grep $dev_name|awk '{printf $10}'`
    tx_old_p=`echo "$net_info_old"|grep $dev_name|awk '{printf $11}'`
    tx_new_p=`echo "$net_info_new"|grep $dev_name|awk '{printf $11}'`
    tx_old_e=`echo "$net_info_old"|grep $dev_name|awk '{printf $13}'`
    tx_new_e=`echo "$net_info_new"|grep $dev_name|awk '{printf $13}'`

    rx=$((${rx_new}-${rx_old}))
    rx_p=$((${rx_new_p}-${rx_old_p}))
    rx_e=$((${rx_old_e}-${rx_new_e}))

    tx=$((${tx_new}-${tx_old}))
    tx_p=$((${tx_new_p}-${tx_old_p}))
    tx_e=$((${tx_old_e}-${tx_new_e}))

    #echo "$rx"
    #echo "$rx_p"
    echo -e "Net_name: $dev_name"
    echo -e "    RX:  $rx\n    RX_P:  $rx_p\n    RX_E:  $rx_e\n    TX:  $tx\n    TX_P:  $tx_p\n    TX_E:  $tx_e\n"
  done
}

#进程信息
process_info(){
  echo -e "----------------------------------------------Process---------------------------------------------\n"
  top_head=`ps aux|head -1`
  
  #cpu占用top5
  top_cpu=`ps aux|grep -v PID|sort -rn -k +3|head`

  #内存占用top5
  top_mem=`ps aux|grep -v PID|sort -rn -k +4|head`

  #业务进程传参
  yw_p_name="sshd"
  yw_p_num=`ps -ef | grep -i ${yw_p_name:- } | grep -v grep|wc -l`

  #僵尸进程
  zombie_num=`ps -A -o stat,ppid,pid,cmd | grep -e '^[Zz]'|wc -l`

  #打开进程数
  process_num=`ps -aux | wc -l`   

  #最大允许进程数
  limit_total_p_n=`ulimit  -u`

  #程序相关总输出
  echo -e "$yw_p_name进程数量:  ${yw_p_num:-null}\n僵尸进程数量:  ${zombie_num:-null}\n运行进程数量:  $((${process_num:-null}-1))\n当前用户允许进程数:  ${limit_total_p_n:-null}\n"
  echo -e "$top_head\nCpu---------------\n$top_cpu\n\nMem------------------\n$top_mem\n"

}

#端口及文件
port_file_limit(){
  echo -e "-------------Port && File------------\n"
  #端口数分别统计ipv4和ipv6
  port_4_n=`netstat -alntup | grep -v   -E '^tcp6|^udp6' |egrep  -i '^tcp|^udp|^TCP|^UDP'| wc -l`
  port_6_n=`netstat -alntup | grep  -E '^tcp6|^udp6' | wc -l`

  #监听端口
  list_port_n=`netstat -ntlpu | egrep  -i '^tcp|^udp|^TCP|^UDP'|wc -l`

  #总端口数
  total_n=`netstat -alntup| egrep  -i '^tcp|^udp|^TCP|^UDP'|wc -l`

  #打开文件总数
  open_f_num=`lsof  | wc -l`
  
  #允许打开文件数
  limit_total_f_n=`cat /proc/sys/fs/file-max`

  echo -e "ipv4端口:  ${port_4_n:-null}\nipv6端口:  ${port_6_n:-null} \n监听端口:  ${list_port_n:-null}\n总打开端口数:  ${total_n:-null}\n允许最大端口数:  65535\n打开文件总数:  ${open_f_num:-null}\n允许打开文件数:  ${limit_total_f_n:-null}"
}

#系统及基本信息
system_info(){
  if cat /proc/version|grep -i centos &>/dev/null;then
    system_version='Centos'
  elif cat /proc/version|grep -i redhat &>/dev/null;then
    system_version='Red hat'
  elif cat /proc/version|grep -i debian &>/dev/null;then
    system_version='Debian'
  elif cat /proc/version|grep -i Ubuntu &>/dev/null;then
    system_version='Ubuntu'
  elif cat /proc/version|grep -i suse &>/dev/null;then
    system_version='Suse'
  else
    echo "This system Manufacturer : unknown"
  fi

  machine_name=`hostname`
  line_n=`w |awk 'NR>2{print $1}'|wc -l `
  login_user=`w |awk 'NR>2{print $1}' |sort -r -n |uniq`
  ip_address=`ip a|grep -i -A2 'MULTICAST,UP,LOWER_UP' | grep -E -o "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)" |grep -E -v "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.255"  | head -1  `
  System_start_time=`uptime | awk '{print $1}'`   #得开机时间
  System_uptime=`uptime |awk -F ',' '{print $1}'  |sed 's#.*up##g'`  #得到运行时常

  #系统信息总输出
  echo -e "-------------System------------\n"
  echo -e "开机时间:  ${System_start_time:-null}"
  echo -e "运行时间: ${System_uptime:-null}"
  echo -e "系统厂商:  ${system_version:-null}\n主 机 名:  ${machine_name:-null}\nIp 地 址:  ${ip_address:-null}\n登录用户:  ${login_user:-$USER}\n在线用户数:  ${line_n:-null}\n"
}


#检测关键文件md5值
Check_file_md5(){
  echo -e "-------------File_sum------------\n时间:  `date`\n"
  #读取文件路径生成MD5保存到临时文件中
  first_ctl=0
  for file_name in /etc/passwd /etc/group /etc/shadow
  do
    if [ -f .history_sum.txt ];then
      #如果first_ctl变量为1表示为第一次获取md5值
      if [ ${first_ctl} -eq 1 ];then
        md5sum  $file_name >> .history_sum.txt
      fi

      #对比md5值
      new_sum=`md5sum  $file_name|awk '{printf $1}'`
      old_sum=`cat  .history_sum.txt |grep  ${file_name}|awk '{printf $1}'`
      if [ "${new_sum}" == "${old_sum}" ];then
        #echo "`date` Check ${file_name} not changed."   >> /var/log/message
        echo "Check ${file_name} not changed."
      else
        #echo "`date` Check ${file_name}  changed!!!"   >> /var/log/message
        echo "Check ${file_name}  changed!!!"
      fi      

    else
      #地没有历史文件,创建一个并且把控制变量置1
      first_ctl=1
      md5sum  $file_name >> .history_sum.txt 
      #echo "`date` Check ${file_name} not changed."  >> /var/log/message
      echo "Check ${file_name} not changed."
    fi
  done
  echo ""
}



main(){
  cpu_info
  mem_info
  io_info
  net_info
  process_info
  port_file_limit
  system_info
  Check_file_md5
}

main

结果

 

**************************************************************************************************************2021年2月20日脚本结束*****************************************************************************************************************

posted @ 2021-02-15 14:01  飞翔的小胖猪  阅读(55)  评论(0编辑  收藏  举报