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日脚本结束*****************************************************************************************************************