找回密码
 立即注册
首页 业界区 业界 Linux 一线必备:高能 Shell 脚本,让工作效能飙升 ...

Linux 一线必备:高能 Shell 脚本,让工作效能飙升

湛恶 10 小时前
@
目录

  • 前言

    • 1、检测两台服务器指定目录下的文件一致性
    • 2、定时清空文件内容,定时记录文件大小
    • 3、检测网卡流量,并按规定格式记录在日志中
    • 4、计算文档每行出现的数字个数,并计算整个文档的数字总数
    • 5.杀死所有脚本
    • 6、从 FTP 服务器下载文件
    • 7、连续输入5个100以内的数字,统计和、最小和最大
    • 8、用户猜数字
    • 9、监测 Nginx 访问日志 502 情况,并做相应动作
    • 10、将结果分别赋值给变量
    • 11、批量修改文件名
    • 12、把一个文档前五行中包含字母的行删掉,同时删除6到10行包含的所有字母
    • 13、统计当前目录中以 .html 结尾的文件总大小
    • 14、扫描主机端口状态
    • 15、用 shell 打印示例语句中字母数小于 6 的单词
    • 16、输入数字运行相应命令
    • 17、Expect 实现 SSH 免交互执行命令
    • 18、监控 httpd 的进程数,根据监控情况做相应处理
    • 19、批量修改服务器用户密码
    • 20、iptables 自动屏蔽访问网站频繁的IP
    • 21、根据web访问日志,封禁请求量异常的IP,如IP在半小时后恢复正常,则解除封禁
    • 22、判断用户输入的是否为IP地址

  • 总结

前言

请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i、微信公众号:白码梦想家
1、检测两台服务器指定目录下的文件一致性
  1. #!/bin/bash
  2. #####################################
  3. #检测两台服务器指定目录下的文件一致性
  4. #####################################
  5. #通过对比两台服务器上文件的md5值,达到检测一致性的目的
  6. dir=/data/web
  7. b_ip=192.168.88.10
  8. #将指定目录下的文件全部遍历出来并作为md5sum命令的参数,进而得到所有文件的md5值,并写入到指定文件中
  9. find $dir -type f|xargs md5sum > /tmp/md5_a.txt
  10. ssh $b_ip "find $dir -type f|xargs md5sum > /tmp/md5_b.txt"
  11. scp $b_ip:/tmp/md5_b.txt /tmp
  12. #将文件名作为遍历对象进行一一比对
  13. for f in `awk '{print 2} /tmp/md5_a.txt'`
  14. do
  15.     #以a机器为标准,当b机器不存在遍历对象中的文件时直接输出不存在的结果
  16.     if grep -qw "$f" /tmp/md5_b.txt
  17.     then
  18.         md5_a=`grep -w "$f" /tmp/md5_a.txt|awk '{print 1}'`
  19.         md5_b=`grep -w "$f" /tmp/md5_b.txt|awk '{print 1}'`
  20.         #当文件存在时,如果md5值不一致则输出文件改变的结果
  21.         if [ $md5_a != $md5_b ]
  22.         then
  23.             echo "$f changed."
  24.         fi
  25.     else
  26.         echo "$f deleted."
  27.     fi
  28. done
复制代码
2、定时清空文件内容,定时记录文件大小
  1. #!/bin/bash
  2. ################################################################
  3. #每小时执行一次脚本(任务计划),当时间为0点或12点时,将目标目录下的所有文件内
  4. #容清空,但不删除文件,其他时间则只统计各个文件的大小,一个文件一行,输出到以时#间和日期命名的文件中,需要考虑目标目录下二级、三级等子目录的文件
  5. ################################################################
  6. logfile=/tmp/`date +%H-%F`.log
  7. n=`date +%H`
  8. if [ $n -eq 00 ] || [ $n -eq 12 ]
  9. then
  10.     #通过for循环,以find命令作为遍历条件,将目标目录下的所有文件进行遍历并做相应操作
  11.     for i in `find /data/log/ -type f`
  12.     do
  13.         true > $i
  14.     done
  15. else
  16.     for i in `find /data/log/ -type f`
  17.     do
  18.         du -sh $i >> $logfile
  19.     done
  20. fi
复制代码
3、检测网卡流量,并按规定格式记录在日志中
  1. #!/bin/bash
  2. #######################################################
  3. #检测网卡流量,并按规定格式记录在日志中
  4. #规定一分钟记录一次
  5. #日志格式如下所示:
  6. #2019-08-12 20:40
  7. #ens33 input: 1234bps
  8. #ens33 output: 1235bps
  9. ######################################################3
  10. while :
  11. do
  12.     #设置语言为英文,保障输出结果是英文,否则会出现bug
  13.     LANG=en
  14.     logfile=/tmp/`date +%d`.log
  15.     #将下面执行的命令结果输出重定向到logfile日志中
  16.     exec >> $logfile
  17.     date +"%F %H:%M"
  18.     #sar命令统计的流量单位为kb/s,日志格式为bps,因此要*1000*8
  19.     sar -n DEV 1 59|grep Average|grep ens33|awk '{print $2,"\t","input:","\t",$5*1000*8,"bps","\n",$2,"\t","output:","\t",$6*1000*8,"bps"}'
  20.     echo "####################"
  21.     #因为执行sar命令需要59秒,因此不需要sleep
  22. done
复制代码
4、计算文档每行出现的数字个数,并计算整个文档的数字总数
  1. #!/bin/bash
  2. #########################################################
  3. #计算文档每行出现的数字个数,并计算整个文档的数字总数
  4. ########################################################
  5. #使用awk只输出文档行数(截取第一段)
  6. n=`wc -l a.txt|awk '{print $1}'`
  7. sum=0
  8. #文档中每一行可能存在空格,因此不能直接用文档内容进行遍历
  9. for i in `seq 1 $n`
  10. do
  11.     #输出的行用变量表示时,需要用双引号
  12.     line=`sed -n "$i"p a.txt`
  13.     #wc -L选项,统计最长行的长度
  14.     n_n=`echo $line|sed s'/[^0-9]//'g|wc -L`
  15.     echo $n_n
  16.     sum=$[$sum+$n_n]
  17. done
  18. echo "sum:$sum"
复制代码
5.杀死所有脚本
  1. #!/bin/bash
  2. if [ $# -ne 1 ]; then
  3.     echo "Usage: $0 filename"
  4. fi
  5. dir=$(dirname $1)
  6. file=$(basename $1)
  7. ftp -n -v << EOF   # -n 自动登录
  8. open 192.168.1.10  # ftp服务器
  9. user admin password
  10. binary   # 设置ftp传输模式为二进制,避免MD5值不同或.tar.gz压缩包格式错误
  11. cd $dir
  12. get "$file"
  13. EOF
复制代码
15、用 shell 打印示例语句中字母数小于 6 的单词
  1. #!/bin/bash  
  2. if [ $# -ne 1 ]; then  
  3.     echo "Usage: $0 filename"  
  4. fi  
  5. dir=$(dirname $1)  
  6. file=$(basename $1)  
  7. ftp -n -v << EOF   # -n 自动登录  
  8. open 192.168.1.10  # ftp服务器  
  9. user admin password  
  10. binary   # 设置ftp传输模式为二进制,避免MD5值不同或.tar.gz压缩包格式错误  
  11. cd $dir  
  12. get "$file"  
  13. EOF
复制代码
16、输入数字运行相应命令
  1. #!/bin/bash
  2. COUNT=1
  3. SUM=0
  4. MIN=0
  5. MAX=100
  6. while [ $COUNT -le 5 ]; do
  7.     read -p "请输入1-10个整数:" INT
  8.     if [[ ! $INT =~ ^[0-9]+$ ]]; then
  9.         echo "输入必须是整数!"
  10.         exit 1
  11.         elif [[ $INT -gt 100 ]]; then
  12.         echo "输入必须是100以内!"
  13.         exit 1
  14.     fi
  15.     SUM=$(($SUM+$INT))
  16.     [ $MIN -lt $INT ] && MIN=$INT
  17.     [ $MAX -gt $INT ] && MAX=$INT
  18.     let COUNT++
  19. done
  20. echo "SUM: $SUM"
  21. echo "MIN: $MIN"
  22. echo "MAX: $MAX"
复制代码
17、Expect 实现 SSH 免交互执行命令

Expect是一个自动交互式应用程序的工具,如telnet,ftp,passwd等。
需先安装expect软件包。
方法1: EOF 标准输出作为 expect 标准输入
  1. #!/bin/bash  # 脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了,
  2. # 猜小了或猜大了,直至用户猜对脚本结束。
  3. # RANDOM 为系统自带的系统变量,值为 0‐32767的随机数
  4. # 使用取余算法将随机数变为 1‐100 的随机数num=$[RANDOM%100+1]echo "$num"
  5. # 使用 read 提示用户猜数字
  6. # 使用 if 判断用户猜数字的大小关系:‐eq(等于),‐ne(不等于),‐gt(大于),‐ge(大于等于),
  7. # ‐lt(小于),‐le(小于等于)
  8. while :
  9. do
  10.     read -p "计算机生成了一个 1‐100 的随机数,你猜: " cai
  11.     if [ $cai -eq $num ]
  12.     then
  13.         echo "恭喜,猜对了"
  14.         exit
  15.     elif [ $cai -gt $num ]
  16.     then
  17.         echo "Oops,猜大了"
  18.     else
  19.         echo "Oops,猜小了"
  20.     fi
  21. done
复制代码
18、监控 httpd 的进程数,根据监控情况做相应处理
  1. 场景:
  2. #1.访问日志文件的路径:/data/log/access.log
  3. #2.脚本死循环,每10秒检测一次,10秒的日志条数为300条,出现502的比例不低于10%(30条)则需要重启php-fpm服务
  4. #3.重启命令为:/etc/init.d/php-fpm restart
  5. #!/bin/bash
  6. ###########################################################
  7. #监测Nginx访问日志502情况,并做相应动作
  8. ###########################################################
  9. log=/data/log/access.log
  10. N=30 #设定阈值
  11. while :
  12. do
  13.     #查看访问日志的最新300条,并统计502的次数
  14.     err=`tail -n 300 $log |grep -c '502" '`
  15.     if [ $err -ge $N ]
  16.     then
  17.         /etc/init.d/php-fpm restart 2> /dev/null
  18.         #设定60s延迟防止脚本bug导致无限重启php-fpm服务
  19.         sleep 60
  20.     fi
  21.     sleep 10
  22. done
复制代码
19、批量修改服务器用户密码

Linux主机SSH连接信息:旧密码
  1. for i in $(echo "4 5 6"); do
  2.     eval a$i=$i
  3. done
  4. echo $a4 $a5 $a6
复制代码
内容格式:IP User Password Port
SSH远程修改密码脚本:新密码随机生成
  1. num=0
  2. for i in $(eval echo $*);do   #eval将{1,2}分解为1 2
  3.     let num+=1
  4.     eval node${num}="$i"
  5. done
  6. echo $node1 $node2 $node3
  7. # bash a.sh 192.168.1.1{1,2}
  8. 192.168.1.11 192.168.1.12
复制代码
生成新密码文件:
  1. arr=(4 5 6)
  2. INDEX1=$(echo ${arr[0]})
  3. INDEX2=$(echo ${arr[1]})
  4. INDEX3=$(echo ${arr[2]})
复制代码
20、iptables 自动屏蔽访问网站频繁的IP

场景:恶意访问,安全防范
1)屏蔽每分钟访问超过200的IP
方法1: 根据访问日志(Nginx为例)
  1. # touch article_{1..3}.html  
  2. # lsarticle_1.html  article_2.html  article_3.html
复制代码
方法2: 通过TCP建立的连接
  1. for file in $(ls *html); do  
  2.     mv $file bbs_${file#*_}  
  3.     # mv $file $(echo $file |sed -r 's/.*(_.*)/bbs\1/')  
  4.     # mv $file $(echo $file |echo bbs_$(cut -d_ -f2)
复制代码
2)屏蔽每分钟SSH尝试登录超过10次的IP
方法1: 通过lastb获取登录状态:
  1. for file in $(find . -maxdepth 1 -name "*html"); do  
  2.      mv $file bbs_${file#*_}done
复制代码
方法2:通过日志获取登录状态
  1. # rename article bbs *.html
复制代码
21、根据web访问日志,封禁请求量异常的IP,如IP在半小时后恢复正常,则解除封禁

[code]#!/bin/bash#####################################################################################根据web访问日志,封禁请求量异常的IP,如IP在半小时后恢复正常,则解除封禁####################################################################################logfile=/data/log/access.log#显示一分钟前的小时和分钟d1=`date -d "-1 minute" +%H%M`d2=`date +%M`ipt=/sbin/iptablesips=/tmp/ips.txtblock(){    #将一分钟前的日志全部过滤出来并提取IP以及统计访问次数    grep '$d1:' $logfile|awk '{print $1}'|sort -n|uniq -c|sort -n > $ips    #利用for循环将次数超过100的IP依次遍历出来并予以封禁    for i in `awk '$1>100 {print $2}' $ips`    do        $ipt -I INPUT -p tcp --dport 80 -s $i -j REJECT        echo "`date +%F-%T` $i" >> /tmp/badip.log    done}unblock(){    #将封禁后所产生的pkts数量小于10的IP依次遍历予以解封    for a in `$ipt -nvL INPUT --line-numbers |grep '0.0.0.0/0'|awk '$2

相关推荐

24 秒前

举报

您需要登录后才可以回帖 登录 | 立即注册