Bash/Shell-脚本整理(长期更新)

Posted LyShark

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Bash/Shell-脚本整理(长期更新)相关的知识,希望对你有一定的参考价值。

轮询检测Apache状态并启用钉钉报警

#!/bin/bash

shell_user="root"
shell_domain="apache"

shell_list="/root/ip_list"
shell_row=`cat $shell_list |wc -l`


function trans_text(){
text=$1

curl https://oapi.dingtalk.com/robot/send?access_token=b4fcf5862088a1bc7f2bf66a -HContent-Type: application/json -d{      #指定钉钉机器人hook地址
            "msgtype": "text", 
            "text": {
            "content": ""$text""
        }, 
}}



function apache_check_80(){
    ip=$1
    URL="http://$ip/index.html"
    HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${URL}"`

    if [ $HTTP_CODE != 200 ]
        then
            trans_text "
                            =================================================================
                                
 $ip Apache 服务器状态异常,网页返回码: "$HTTP_CODE" 请及时处理 ! 

                                ================================================================= 
"
    fi
}

while true
do

shell_list="/root/ip_list"
shell_row=`cat $shell_list |wc -l`
    for temp in `seq 1 $shell_row`
    do
            Ip_Addr=`cat $shell_list |head -n $temp |tail -n 1`
        apache_check_80 $Ip_Addr
    done

    sleep 10
done

 

打印彩虹

 

declare -a ary


for i in `seq 40 49`
do

    ary[$i]=" "
    echo -en "e[$i;5m ${ary[@]}e[;0m"
    
done


declare -a ary
for s in `seq 1 10000`
do
    for i in `seq 40 49`
    do
        ary[$i]=" "
        echo -en "e[$i;5m ${ary[@]}e[;0m"    
    done
done

 

打印菱形

#!/bin/bash

for (( i = 1; i < 12; i++))
do
    if [[ $i -le 6 ]]
    then
        for ((j = $((12-i)); j > i; j--))
        do
            echo -n " "
        done

        for ((m = 1; m <= $((2*i-1)); m++))
        do
             echo -n "* "
        done
            echo ""
#*****************************************************************************
    elif [[ $i -gt 6 ]]
    then
        n=$((12-i))
        for ((j = $((12-n)); j > n; j--))
        do
            echo -n " "
        done

        for ((m = 1; m <= $((2*n-1)); m++))
        do
                        echo -n "* "
        done
            echo ""
    fi

done

 

expect实现远程登陆自动交互

#!/usr/bin/expect -f

set ipaddress [lindex $argv 0]

set passwd [lindex $argv 1]

set timeout 30

spawn ssh-copy-id [email protected]$ipaddress

expect {

"yes/no" { send "yes
";exp_continue }

"password:" { send "$passwd
" }

}



#expect "*from*"

#send "mkdir -p ./tmp/testfile
"

#send "exit
"

#expect "#" #i# 命令运行完, 你要期待一个结果, 结果就是返回shell提示符了(是# 或者$)

 

http心跳检测

URL="http://192.168.22.191/index.html"

THHP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${URL}"`

if [ $HTTP_CODE != 200 ]
then
    echo -e "apache code:"$HTTP_CODE""
fi

 

PV过量自动实现防火墙封IP

#!/bin/bash

log=/tmp/tmp.log

[ -f $log ] || touch $log

function add_iptales()
{
        while read line
        do
                ip=`echo $line |awk {print $2}`
                count=`echo $line |awk {print $1}`
                        if [ $count -gt 100 ] && [ `iptables -L -n |grep "$ip" |wc -l` -lt 1 ]
                                then
                                        iptables -I INPUT -s $ip -j DROP
                                        echo -e "$list isdropped">>/tmp/droplist.log
                        fi

        done<$log
}



function main()
{
        while true
        do
                netstat -an|grep "EST" |awk -F [:]+ {print $6}|sort |uniq -c >$log
                add_iptales
                sleep 180
        done

}


main

 

shell实现自动安装

#!/bin/bash



function MyInstall
{
        if ! rpm -qa |grep -q "^$1"
        then

                yum install $1
                if [ $? -eq 0 ]
                then
                        echo -e "$i install is ok
"
                else
                        echo -e "$1 install no
"
                fi
        else
                echo -e "yi an zhuang ! 
"
        fi
}


for ins in mysql php httpd
do
        MyInstall $ins
done

 

shell实现插入排序

#!/bin/bash


declare -a array


for i in `seq 1 10`
do
    array[$i]=$RANDOM

done

echo -e "Array_1:  ${array[@]}"



for (( x=1;x<=9;x++ ))
do
    for(( y=1;y<=9;y++ ))
    do
        if [ ${array[$y]} -gt ${array[$y+1]} ]
        then
            temp=${array[$y]}
            array[$y]=${array[$y+1]}
            array[$y+1]=$temp
        fi

    done

done


echo -e "Array_2:  ${array[@]}"

 

bash实现动态进度条

#!/bin/bash
i=0
bar=‘‘
index=0
arr=( "|" "/" "-" "\" )

while [ $i -le 100 ]
do
    let index=index%4
    printf "[%-100s][%d%%][e[43;46;1m%ce[0m]
" "$bar" "$i" "${arr[$index]}"
    let i++
    let index++
    usleep 30000
    bar+=#
    clear
done

printf "
"

 

根据文件内容创建账号

#!/bin/bash


for Uname in `cat /root/useradd.txt |gawk {print $1}`
do

                id $Uname &> /dev/null
                if [ $? -eq 0 ]
                then
                        echo -e "这个账号已存在!"
                        continue
                fi
        for Upasswd in `cat /root/useradd.txt |gawk {print $2}`
        do
                useradd $Uname &> /dev/null
                echo "$Upasswd" |passwd --stdin $Uname &> /dev/null
                if [ $? -eq 0 ]
                then
                        echo -e "账号创建成功!"
                else
                        echo -e "创建失败!"
                fi

        done

done

 

红色进度条

#!/bin/bash


declare -a ary


for i in `seq 0 20`
do

    ary[$i]=" "
    echo -en "e[41;5m ${ary[@]}e[;0m"
    sleep 1
    
done

 

监控服务器网卡流量

#!/bin/bash
#network
#Mike.Xu
while : ; do
speedtime=date +%m"-"%d" "%k":"%M
speedday=date +%m"-"%d
speedrx_before=ifconfig eth0|sed -n "8"p|awk {print $2}|cut -c7-
speedtx_before=ifconfig eth0|sed -n "8"p|awk {print $6}|cut -c7-
sleep 2
speedrx_after=ifconfig eth0|sed -n "8"p|awk {print $2}|cut -c7-
speedtx_after=ifconfig eth0|sed -n "8"p|awk {print $6}|cut -c7-
speedrx_result=$[(speedrx_after-speedrx_before)/256]
speedtx_result=$[(speedtx_after-speedtx_before)/256]
echo"$speedday$speedtime Now_In_Speed: "$speedrx_result"kbps Now_OUt_Speed: "$speedtx_result"kbps"
sleep 2
done

 

检测CPU剩余百分比

#!/bin/bash

#Inspect CPU

#Sun Jul 31 17:25:41 CST 2016

PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/wl/bin
export PATH

TERM=linux
export TERM

CpuResult=$(top -bn 1 | grep "Cpu" | awk {print $5} | sed s/..*$//g)

if [[ $CpuResult < 20 ]];then
  echo "CPU WARNING : $CpuResult" > /service/script/.cpu_in.txt
  top -bn 1 >> /service/script./cpu_in.txt
  mail -s "Inspcet CPU" wl < /service/script/.cpu_in.txt
fi

 

检测磁盘剩余空间

#!/bin/bash

#Insepct Harddisk , If the remaining space is more than 80%, the message is sent to the wl

#Tue Aug  2 09:45:56 CST 2016

PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/wl/bin

export PATH

for RemainingSpace in $(df -h | awk {print $5} | grep -v Use | sed -e s/[%]//g)
do
  if [[ $RemainingSpace > 80 ]];then
    echo -e "$RemainingSpace"
    echo -e "$(df -h | grep $RemainingSpace)" > /service/script/.HarddiskWarning
    mail -s "disk Warning" wl < /service/script/.HarddiskWarning
  fi
done

 

bash-实现检测apache状态并钉钉报警

#!/bin/bash


function trans_text(){
    text=$1
curl https://oapi.dingtalk.com/robot/send?access_token=b4fcf5862088a1bc7f2bf66aea051869e62ff5879fa0e0fddb0db9b1494781c2 -HContent-Type: application/json -d{
    "msgtype": "text", 
    "text": {
        "content": ""$text""
    }, 
}}


function desk_check(){
    
    dftype=$1
    shell_row=`df |wc -l`

for i in `seq 2 $shell_row`
do

    temp=(`df -h |head -n $i |tail -n 1 |awk {print $5 "	" $6}`)
    disk="`echo ${temp[0]} |cut -d "%" -f 1`"
    name="${temp[1]}"
    hostname=`hostname`
    IP=`ifconfig |grep -v "127.0.0.1" |grep "inet addr:" |sed s/^.*inet addr://g|sed s/ Bcas..*$//g`
    #echo -e "$disk     $name"
    Dat=`date "+%F %T"`
    
    if [ $disk -ge $dftype ]
    then
        echo  "
                            ======================== 

                    >磁盘分区异常< 

               主机名: $hostname 
        
               IP地址: $IP 

                分区名: $name 

               使用率: $disk %
 
               发生时间: $Dat 

                          ========================= 
"
    fi
done
}

function apache_check(){
    url=$1
URL="http://$url/"
HTTP_CODE=`curl -o /dev/null -s -w "%{http_code}" "${URL}"`

if [ $HTTP_CODE != 200 ]
    then
        echo  "
                           ======================== 

                   >Apache服务异常<
                           主机名: $hostname 
         
                           IP地址: $IP 

                           返回代码: $HTTP_CODE 

                           发生时间: $Dat 

                          ========================= 
"                        
fi
}

while true
do
    desk_check 10
    apache_check 127.0.0.1

    sleep 10
done

 

内存检测

#!/bin/bash

#Inspect Memory : If the memory is less than 500 , then send mail to wl

#Tue Aug  2 09:13:43 CST 2016


PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/wl/bin

export PATH


MEM=$(free -m | grep "Mem" | awk {print $4})

if [[ MEM < 500 ]];then
  echo -e "Memory Warning : Memory free $MEM" > /service/script/.MemoryWarning
  mail -s "Memory Warning" wl < /service/script/.MemoryWarning
fi

 

剩余inode检测

#!/bin/bash

#Inspcet Inode : If the free INODE is less than 200, the message is sent to the wl

#Tue Aug  2 10:21:29 CST 2016

PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/wl/bin

export PATH

for FreeInode in $(df -i | grep -v "Filesystem" | awk {print $4})
do
  if [[ $FreeInode < 200 ]];then
    echo -e "$(df -i | grep "$FreeInode")" > /service/script/.FreeInode
    mail -s "FreeInode Warning" wl < /service/script/.FreeInode
  fi
done

 

判断哪些用户登陆了系统

#!/bin/bash

declare -i count=0

while true;do

        if who |grep -q -E "^wang"
        then
                echo -e "用户wang 登陆了系统
 这是第$count 次!"
                break
        else
                let count++
        fi

        sleep 3
done
~    



示例:找出UID为偶数的所有用户,显示其用户名和ID号;

#!/bin/bash
while read line; do
    userid=$(echo $line | cut -d: -f3)
    if [ $[$userid%2] -eq 0 ]; then
echo $line | cut -d: -f1,3
    fi
done < /etc/passwd

 

 

批量创建账号

#!/bin/bash

sum=1

while [ $sum -le 30 ]
do
    if [ $sum -le 9 ]
    then
        user="user_0$sum"
    else
        user="user_$sum"
    fi

        useradd $user
        echo "123456" |passwd --stdin $user
        chage -d 0 $user
        let sum=sum+1

done

 

批量扫面存活

#!/bin/bash
#By:lyshark

#nmap 192.168.22.0/24>ip


MAC=`cat ip |awk $1 == "MAC" && $NF == "(VMware)"{print $3}`

for i in `seq 1 20`

do

temp=`echo ${MAC[@]} |awk {print $i}`

IP=`cat /ip |grep  -B5 $temp |grep "Nmap scan"|awk {print $5}`


    echo $IP |awk {print $1}
done

 

正则匹配IP

^[0-9]{0,2}|^1[0-9]{0,2}|^2[0-5]{0,2}

 egrep "(^[0-9]{1,2}|^1[0-9]{0,2}|^2[0-5]{0,2}).([0-9]{1,2}|1[0-9]{0,2}|2[0-5]{0,2}).([0-9]{1,2}|1[0-9]{0,2}|2[0-5]{0,2}).([0-9]{1,2}|1[0-9]{0,2}|2[0-5]{0,2})$"





([0-9]{1,2}|1[0-9]{0,2}|2[0-5]{0,2})
([0-9]{1,2}|1[0-9]{0,2}|2[0-5]{0,2})
([0-9]{1,2}|1[0-9]{0,2}|2[0-5]{0,2})
([0-9]{1,2}|1[0-9]{0,2}|2[0-5]{0,2})



egrep "((25[0-5]|2[0-4][0-9]|((1[0-9]{2})|([1-9]?[0-9]))).){3}(25[0-5]|2[0-4][0-9]|((1[0-9]{2})|([1-9]?[0-9])))"



ls |egrep "((25[0-5]|2[0-4][0-9]|((1[0-9]{2})|([1-9]?[0-9]))).){3}(25[0-5]|2[0-4][0-9]|((1[0-9]{2})|([1-9]?[0-9])$))"

 

正则匹配邮箱

egrep "^[0-9a-zA-Z][0-9a-zA-Z_]{1,16}[0-9a-zA-Z]@[0-9a-zA-Z-]*([0-9a-zA-Z])?.(com|com.cn|net|org|cn)$" rui


ls |egrep "^(([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]).){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])$"

 

实现布片效果

#!/bin/bash


function ary_go
{
    $1 $2
    
    for (( i=0;i<=$1;i++ ))
    do
        for (( s=0;s<=$2;s++ ))
        do
            if [ $[$i%2] == 0 ]
            then
        
                if [ $[$s%2] == 0 ]
                then
                    echo -en "  "
                else
                    echo -en "e[;44m  e[;m"
                fi
            else
                                                if [ $[$s%2] == 0 ]
                                then
                                        echo -en "e[;42m  e[;m"
                                else
                                        echo -en "  "
                                fi



            fi

        done
            echo 

    done

}


ary_go 25 50

 

剔除白名单以外的用户

#!/bin/bash
w | awk NR>=3 {printf $1 "	" $2 "	" $3 "
"} > /tmp/who.txt
for i in $(awk {printf $1} /tmp/bai.txt)
do
        k=$(egrep -v "$i" /tmp/who.txt | awk {printf $2} "
" | awk {printf $2 "
"})
        for j in $k
        do
                pkill -9 -t "$j"
        done
done

 

以上是关于Bash/Shell-脚本整理(长期更新)的主要内容,如果未能解决你的问题,请参考以下文章

Python-脚本整理(长期更新)

“笨办法”学Bash Shell(持续更新中)

常用python日期日志获取内容循环的代码片段

小程序各种功能代码片段整理---持续更新

关于bash shell的相关整理与练习

sh [Bash Shell脚本模板] #Simple bash脚本模板