自己写的shell脚本,温故知新

174 阅读2分钟

自己学习的一些shell脚本,做个总结,不断提高自己的脚本能力,不断地添加,不断地温故而知新

1.批量修改文件名称

首先伪造Y一批文件:
    touch dingyawu_{1..5}_finished.jpg
修改文件名称:
    for file_name in `ls *_finished.png*`;do mv $file_name ${file_name//_finished/}; done;
    

2.统计加法

    1. echo {1..100} | tr " " "+" | bc
    2. echo $((`seq -s "+" 100`))
    3. seq -s " + " 100 | xargs expr

3.创建文件夹

test -e "hello.txt" && echo "该文件已存在,不需要重复创建了" || mkdir hello.txt

4.通过位置变量创建linux系统账户及密码

#!/bin/bash

`useradd $1`
echo "$2" |passwd --stdin "$1"

5判断进程是否在执行

#!/bin/bash
num=$(ps -ef |grep $1 |grep -vc grep)
if [ $num -eq 1 ]
   then echo "$1 running."
else
    echo "$1 is not running!"
fi

6. 动态定义文件名

#!/bin/bash  
# copy the /usr/bin directory listing to a log file  
today=$(date +%y%m%d)  
ls /usr/bin -al > log.$today

7. 遍历文件夹

for file in /home/rich/test/*
do
    if [ -d "$file" ]
    then
       echo "$file is a directory"
    elif [ -f "$file" ]
    then
       echo "$file is a file"
    fi
done

8.一键查看服务器利用率

CPU top,vmstat

内存

硬盘

TCP连接状态

image.png

重点关注 us,sy, id, wa

image.png

total = used + avaliable

#! /bin/bash
function cpu(){
   util=$(vmstat | awk '{if(NR==3)print $13+$14}')
   iowait=$(vmstat | awk '{if(NR==3)print $16}')
   echo "cpu使用率:${util}, 等待磁盘IO响应使用率: ${iowait}"
}

function mem(){

    total=$(free -m | awk '{if(NR==2)printf "%.1f", $2/1024}')
    used=$(free -m | awk '{if(NR==2)printf "%.1f", ($2-$NF)/1024}')
    ava=$(free -m | awk '{if(NR==2)printf "%.1f", $NF/1024}')
    echo "内存总大小:${total}, 已使用: ${used} , 剩余:${ava}"
}

function disk(){
   ff=$(df -h | awk '/^\/dev/{print $1}')
   for p in $ff; do
      mounted=$(df -h | awk -v p=$p '$1==p{print $NF}')
      size=$(df -h | awk -v p=$p '$1==p{print $2}')
      used=$(df -h | awk -v p=$p '$1==p{print $3}')
      used_percent=$(df -h | awk -v p=$p '$1==p{print $5}')
      echo "硬盘-挂载点: ${mounted}, 总大小:${size}, 已使用:${used}, 使用率:${used_percent}"
   done
}

function tcp_status(){
    summary=$(netstat -antp | awk '{a[$6]++}END{for( i in a)printf i ":" a[i] " "}')
    echo "TCP连接状态:${summary}"

}

cpu
mem
disk
tcp_status

9. 找出占用CPU、内存过高的进程

#! /bin/bash

echo "找出占用CPU、内存过高的进程"

echo "--------------cpu top 10 ------------------"
ps -eo pid,pcpu,pmem,args --sort=-pcpu | head -n 10
echo "--------------memory  top 10 ------------------"
ps -eo pid,pcpu,pmem,args --sort=-pmem | head -n 10

10. 查看网卡的实时流量

ifconfig 查看网卡的信息

cat /proc/net/dev

awk '0~"eth0" {print 2}' /proc/net/dev

使用$0表示使用所有域, =、~匹配正则表达式、!~不匹配正则表达式

查看接受的流量和发出的流量

image.png

#! /bin/bash
NIC=$1
echo -e "in ----------- out"
while true;do
        OLD_IN=$(awk '$0~"'$NIC'"{print $2}' /proc/net/dev)
        OLD_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev)
        sleep 1
        NEW_IN=$(awk '$0~"'$NIC'"{print $2}' /proc/net/dev)
        NEW_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev)
        IN=$(printf "%.1f%s" "$((($NEW_IN - $OLD_IN)/1024))" "KB/s")
        OUT=$(printf "%.1f%s" "$((($NEW_OUT - $OLD_OUT)/1024))" "KB/s")
        echo "$IN   $OUT"

done

11. 批量检查网站是否正常

#! /bin/bash
# 批量检查网站是否正常
URL_LIST="www.baidu.com www.ctnrs.com"

for URL in URL_LIST; do
    FAIL_COUNT=0
    for ((i=1;i<=3;i++)); do
        HTTP_CODE=$(curl -o /dev/null --connect-timeout 3 -s -w "%{http_code}" $URL)
        if [ $HTTP_CODE -eq 200 ]; then
            echo "$URL ok"
            break
        else
            echo "retry $FAIL_COUNT"
            let FAIL_COUNT++
        fi
    done
    if [ $FAIL_COUNT -eq 3 ]; then
        echo "warning: $URL access failure"
    fi
done

12. 自动登录服务器的脚本

sh connect.sh  (df -h)

#! /bin/bash

HOST_INFO=host.info
for IP in $(awk '/^[^#]/{print $1}' $HOST_INFO); do
    USER=$(awk -vip=$IP 'ip==$1{print $2}' $HOST_INFO)
    PORT=$(awk -vip=$IP 'ip==$1{print $3}' $HOST_INFO)
    PASS=$(awk -vip=$IP 'ip==$1{print $4}' $HOST_INFO)
    expect << EOF
    set timeout 30
    spawn ssh -p $PORT $USER@$IP
    expect {
        "(yes/no)" {send "yes\r"; exp_continue}
        "password:" {send $PASS\r"}

    }
    expect "$USER@*" {send "$1\r"}
    expect "$USER@*" {send "exit\r"}
EOF
done

12. nginx 日志监控脚本

#! /bin/bash
#日志格式 :
LOG_FILE=$1
echo "统计访问最多的10个IP"
awk '{a[$1]++}END{print "PV:", length(a);for(v in a); print v, a[v]}' $LOG_FILE  | sort -k2 -nr | head -n 10
echo "-------------------"
echo "统计时间段访问最多的IP"
awk '$4>="[01/Jan/2023:14:26:51" && $4<="[10/Jan/2023:14:26:51" {a[$1]++}END{for(v in a)print v, a[v]}' $LOG_FILE  | sort -k2 -nr | head -n 10
echo "-------------------"
echo "统计访问最多的10个页面"
awk '{a[$7]++}END{print "UV:", length(a); for(v in a){if(a[v]>10)print v, a[v]}}' $LOG_FILE  | sort -k2 -nr | head -n 10
echo "统计访问页面状态码数量"
awk '{a[$7" "$9]++}END{for(v in a){if(a[v]>5)print v, a[v]}}' $LOG_FILE  | sort -k3 -nr 


12. nginx 日志防止DDOS攻击

#! /bin/bash

DATE=$(date +"%d/%b/%Y:%H:%M")
NGINX_FILE=/usr/local/nginx/logs/access.log
ABNORMAL_IP=$(tail -n 50000 $NGINX_FILE | grep $DATE | awk '{a[$1]++}END{for(i in a)if(a[i]>10)print i}')
for IP in $ABNORMAL_IP; do
	if [ $(iptables -vnL | grep -c $IP) -eq 0 ]; then
		iptables -I INPUT -s $IP -j DROP
		echo "$(date + '%F_%T') $IP" >> /tmp/drop_ip.log
	fi
done