zoukankan      html  css  js  c++  java
  • shell编程实战学习(4)

    shell编程实战学习(4)

    一、企业案列

    1.1.1 企业案列(DDOS攻击)

    1.根据访问ip统计uv
    awk '{print $1}' access.log|sort | uniq -c |wc -l
    2.统计访问ip统计pv
    awk '{print $7}' access.log|wc -l
    3.查询访问最频繁的URL
    awk '{print $7}' access.log|sort | uniq -c |sort -n -k 1 -r|more
    4.查询访问最频繁的IP
    awk '{print $1}' access.log|sort | uniq -c |sort -n -k 1 -r|more
    5.根据时间段统计查看日志
    cat access.log| sed -n '/14/Mar/2015:21/,/14/Mar/2015:22/p'|more
    6.阿里云端口检测扫描[root@blog ~]# netstat -an|awk -F "[ :]+" '/ESTABLISHED/{print $(NF-2)}'|sort|uniq -c|sort -nr|haed -10
    
    1. 域名访问去重统计
    #unqp 去重命令 -c 统计 计数
    #sort 排序命令 -r 倒序 -n 数字排序
    [root@web01 ~]# cat test.txt
    www.etiantian.org
    bbs.etiantian.org
    www.etiantian.org
    blog.etiantian.org
    www.etiantian.org
    www.etiantian.org
    blog.etiantian.org
    www.etiantian.org
    www.etiantian.org
    www.etiantian.org
    www.etiantian.org
    [root@web01 ~]# sort test.txt|uniq -c
          1 bbs.etiantian.org
          2 blog.etiantian.org
          8 www.etiantian.org
    
    1. DDOS攻击案列
    [root@web01 /server/scripts]# cat ctrl_ddos1.sh 
    #!/bin/bash
    #Author:chenhj
    #Blog:https://www.cnblogs.com/woaiyunwei/
    #Time:2020-05-26 17:17:38
    #Name:ctrl_ddos.sh
    #Version:V1.0
    #Description:This is a test script.
    function count_ip(){
    awk -F "[ :]+" '/ESTABLISHED/{print $(NF-2)}' /root/netstat.log |sort|uniq -c |sort -nr|head -10 >/tmp/ip.log
    while read line
    do
        ip=`echo $line|awk '{print $2}'`
        count=`echo $line|awk '{print $1}'`
        if [ $count -gt 10 ] && [ `iptables -nL|grep 29.39.210.20|wc -l` -eq 0 ]
        then
            iptables -I INPUT -s $ip -j  DROP
            echo "$ip dangerous iptbales drop ok"
        else
            echo "$ip security is ok " &>/dev/null
        fi
            
    done</tmp/ip.log
    }
    
    function main(){
      while true
      do
          count_ip
          sleep 120
      done
    }
    
    main
    ===============================================
    [root@web01 ~]# iptables -nL
    Chain INPUT (policy ACCEPT)
    target     prot opt source               destination         
    DROP       all  --  29.39.210.20         0.0.0.0/0           #被封掉的ip
    
    Chain FORWARD (policy ACCEPT)
    target     prot opt source               destination         
    
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination         
    
    

    二、for循环

    2.1.1 for循环

    1. for循环语法格式
    fi "变量名" in “变量取值列表”
    do 
       指令
    done
    
    1. 实例
    [root@web01 /server/scripts]# cat for1.sh 
    #!/bin/bash
    #Author:chenhj
    #Blog:https://www.cnblogs.com/woaiyunwei/
    #Time:2020-05-26 18:56:21
    #Name:for1.sh
    #Version:V1.0
    #Description:This is a test script.
    
    for n in {1..5}
    do
        echo $n
    done
    =======================================
    [root@web01 /server/scripts]# sh for1.sh
    1
    2
    3
    4
    5
    =========================================
    [root@web01 /server/scripts]# cat for1.sh
    #!/bin/bash
    #Author:chenhj
    #Blog:https://www.cnblogs.com/woaiyunwei/
    #Time:2020-05-26 18:56:21
    #Name:for1.sh
    #Version:V1.0
    #Description:This is a test script.
    
    for n in `seq 5`
    do
        echo $n
    done
    ==========================================
    [root@web01 /server/scripts]# sh for1.sh
    1
    2
    3
    4
    5
    
    
    1. 第二种for循环称之为C语言型for循环,其结构如下:
    for ((exp1;exp2;exp3))
    do
       指令
    done
    
    1. 实例
    [root@web01 /server/scripts]# cat for2.sh
    #!/bin/bash
    #Author:chenhj
    #Blog:https://www.cnblogs.com/woaiyunwei/
    #Time:2020-05-26 19:17:05
    #Name:for2.sh
    #Version:V1.0
    #Description:This is a test script.
    
    for ((i=1;i<=5;i++))
    do
        echo $i
    done
    ================================================
    [root@web01 /server/scripts]# sh for2.sh
    1
    2
    3
    4
    5
    
    1. linux 随机数生成方法
    [root@web01 ~]# openssl rand -base64 40
    93cJHucaYR+eSdoWKOJtQSSa/aTjPaoIHpr9LEqjeC4Py4pNJBIuVQ==
    [root@web01 ~]# openssl rand -base64 100
    N5FCGGVQeWn/sSjqUMG7cKOhrvXqb6hvsefOcGVUj8EtxZKgv1OBARfuLNu5FUyp
    zOq2T8p+fahHK3ChLjMJjxm1UaMTy8mksr5S7z6Z2ZL0wZ9PJvQNZX45glgEWNjo
    p/jYig==
    [root@web01 ~]# openssl rand -base64 10|cut -c 1-8  #利用cut -c 参数 可以截取你想要的长度
    r8MhFCul
    =======================================================
    [root@web01 ~]# echo $RANDOM   #RANDOM是shell的内置函数
    15423
    [root@web01 ~]# echo $RANDOM
    11366
    [root@web01 ~]# echo $RANDOM
    5183
    [root@web01 ~]# echo $RANDOM
    29841
    ============================================================
    #命令管道接md5sum也可以
    [root@web01 ~]# uptime|md5sum 
    aab5cb04e7483f22e9a73895b8eac092  -
    [root@web01 ~]# date|md5sum 
    a90ed78623aeb6df169ad9044444cb3c  -
    [root@web01 ~]# date|md5sum|cut -c 5-8
    5fb2
    [root@web01 ~]# date|md5sum|cut -c 1-8
    14224313
    [root@web01 ~]# uptime|md5sum|cut -c 1-8
    ba9bf319
    ============================================
    [root@web01 ~]#  mkpasswd    #这个命令需要安装expect
    +ci02sBQo
    [root@web01 ~]#  mkpasswd  
    x5et!Z4xH
    [root@web01 ~]#  mkpasswd  
    :zytr83JV
    [root@web01 ~]#  mkpasswd  
    gK:25pcyA
    [root@web01 ~]#  mkpasswd -l 15 -d 3 -C 5 #-l 密码长度 -d密码中数字的数量 -c指定小写字母的数量 -C指定大写字母的数量 -s 指定特殊字符的数量
    dKo2LF7t}dJAmy7
    
    1. 使用for循环在/oldboy目录下批量创建10个HTML文件,其中每个文件需要包含10个随机小写字母加固定字符串oldboy
    #[root@web01 ~]# openssl rand -base64 10|tr '[0-9A-Z]' '[a-z]'|cut -c 1-8
    #[root@web01 ~]# openssl rand -base64 10|sed 's#[^a-z]##g'  #推荐这个
    [root@web01 ~]# openssl rand -base64 40|sed 's#[^a-z]##g'|cut -c 1-10
    tkxvoenndr
    =======================================================================
    [root@web01 /server/scripts]# cat for_touch.sh 
    #!/bin/bash
    #Author:chenhj
    #Blog:https://www.cnblogs.com/woaiyunwei/
    #Time:2020-05-26 19:30:22
    #Name:for_touch.sh
    #Version:V1.0
    #Description:This is a test script.
    [ -d /oldboy ] && cd /oldboy||{
    mkdir /oldboy
    cd /oldboy
    }
    for ((i=1;i<=10;i++))
    do
        RAND=`openssl rand -base64 40|sed 's#[^a-z]##g'|cut -c 1-10`
        touch ${RAND}_oldboy.html
    done
    ===================================================================
    [root@web01 /server/scripts]# sh for_touch.sh
    [root@web01 /server/scripts]# ll /oldboy/
    total 0
    -rw-r--r-- 1 root root 0 May 26 20:50 dkhhcttuyl_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 fwstbokeyp_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 jslxvuyiot_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 jtpytqtosv_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 ntnggassov_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 qkgctyxmyx_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 rakhfgkahs_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 riumnrwkrp_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 xxxcvwcmxy_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 zbzlgrzdpo_oldboy.html
    
    1. 利用for循环批量改名
    #rename
    [root@web01 /oldboy]# ll
    total 0
    -rw-r--r-- 1 root root 0 May 26 20:50 dkhhcttuyl_oldgirl.HTML
    -rw-r--r-- 1 root root 0 May 26 20:50 fwstbokeyp_oldgirl.HTML
    -rw-r--r-- 1 root root 0 May 26 20:50 jslxvuyiot_oldgirl.HTML
    -rw-r--r-- 1 root root 0 May 26 20:50 jtpytqtosv_oldgirl.HTML
    -rw-r--r-- 1 root root 0 May 26 20:50 ntnggassov_oldgirl.HTML
    -rw-r--r-- 1 root root 0 May 26 20:50 qkgctyxmyx_oldgirl.HTML
    -rw-r--r-- 1 root root 0 May 26 20:50 rakhfgkahs_oldgirl.HTML
    -rw-r--r-- 1 root root 0 May 26 20:50 riumnrwkrp_oldgirl.HTML
    -rw-r--r-- 1 root root 0 May 26 20:50 xxxcvwcmxy_oldgirl.HTML
    -rw-r--r-- 1 root root 0 May 26 20:50 zbzlgrzdpo_oldgirl.HTML
    [root@web01 /oldboy]# rename "oldgirl.HTML" "oldboy.html" *.HTML
    [root@web01 /oldboy]# ll
    total 0
    -rw-r--r-- 1 root root 0 May 26 20:50 dkhhcttuyl_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 fwstbokeyp_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 jslxvuyiot_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 jtpytqtosv_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 ntnggassov_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 qkgctyxmyx_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 rakhfgkahs_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 riumnrwkrp_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 xxxcvwcmxy_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 zbzlgrzdpo_oldboy.html
    
    ================================================
    #mv
    [root@web01 /server/scripts]# cat for_mv.sh 
    #!/bin/bash
    #Author:chenhj
    #Blog:https://www.cnblogs.com/woaiyunwei/
    #Time:2020-05-26 21:00:16
    #Name:for_mv.sh
    #Version:V1.0
    #Description:This is a test script.
    cd /oldboy
    for file1 in `ls`
    do
        mv $file1 ${file1/oldboy.html/oldgirl.HTML}
    done
    =====================================================
    [root@web01 /server/scripts]# ls /oldboy/
    dkhhcttuyl_oldgirl.HTML  jslxvuyiot_oldgirl.HTML  ntnggassov_oldgirl.HTML  rakhfgkahs_oldgirl.HTML  xxxcvwcmxy_oldgirl.HTML
    fwstbokeyp_oldgirl.HTML  jtpytqtosv_oldgirl.HTML  qkgctyxmyx_oldgirl.HTML  riumnrwkrp_oldgirl.HTML  zbzlgrzdpo_oldgirl.HTML
    ================================================================
    #命令行拼接不用for循环
    [root@web01 /oldboy]# ls
    fwstbokeyp_oldgirl.HTML
    jslxvuyiot_oldgirl.HTML
    jtpytqtosv_oldgirl.HTML
    ntnggassov_oldgirl.HTML
    qkgctyxmyx_oldgirl.HTML
    rakhfgkahs_oldgirl.HTML
    riumnrwkrp_oldgirl.HTML
    xxxcvwcmxy_oldgirl.HTML
    zbzlgrzdpo_oldgirl.HTML
    
    [root@web01 /oldboy]# ls *|awk -F "_" '{print "mv",$0,$1"_oldboy.html"}'|bash
    [root@web01 /oldboy]# ll
    total 0
    -rw-r--r-- 1 root root 0 May 26 20:50 dkhhcttuyl_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 fwstbokeyp_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 jslxvuyiot_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 jtpytqtosv_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 ntnggassov_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 qkgctyxmyx_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 rakhfgkahs_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 riumnrwkrp_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 xxxcvwcmxy_oldboy.html
    -rw-r--r-- 1 root root 0 May 26 20:50 zbzlgrzdpo_oldboy.html
    
    1. 筛选出下列长度小于等于6的单词
    #I am oldboy teacher welcome to oldboy training class
    [root@web01 /server/scripts]# cat for_lt.sh 
    #!/bin/bash
    #Author:chenhj
    #Blog:https://www.cnblogs.com/woaiyunwei/
    #Time:2020-05-27 10:40:46
    #Name:for_lt.sh
    #Version:V1.0
    #Description:This is a test script.
    
    ct_word="I am oldboy teacher welcome to oldboy training class"
    for n in $ct_word 
    do
        if [ ${#n} -le 6 ]
        then
            echo $n
        fi
    done
    =====================================================================
    [root@web01 /server/scripts]# sh for_lt.sh 
    I
    am
    oldboy
    to
    oldboy
    class
    

    2.1.2 循环控制命令

    1.说明

    控制命令 作用说明
    break n 如果省略n 表示跳出整个循环,n表示跳出循环的层数
    continue n 如果省略n表示跳过本次循环 ,忽略本次循环的剩余代码,进入循环的下一次循环 n 表示退到第n层继续循环
    exit n 退出当前shell 程序,n为上一次程序执行的状态返回值。n也可以省略,再下一个shell里可以通过¥?接受exit n的n值
    return 用于在函数里,作为函数的返回值,用于判断函数执行是否正确。在下一个shell里通过$?接受return n的 n值
    1. 实例
    #continue
    [root@web01 /server/scripts]# cat for_cred.sh 
    #!/bin/bash
    #Author:chenhj
    #Blog:https://www.cnblogs.com/woaiyunwei/
    #Time:2020-05-27 14:35:46
    #Name:for.creb.sh
    #Version:V1.0
    #Description:This is a test script.
    
    for n in {1..5}
    do
        if [ $n -eq 3 ]
        then
            continue
        fi
        echo $n
    done
    echo ok
    
    [root@web01 /server/scripts]# sh for_cred.sh 
    1
    2
    4
    5
    ok
    #匹配到3就不打印3跳出3这个循环,进入下一个循环
    ================================================
    #break 退出循环
    [root@web01 /server/scripts]# cat for_cred.sh 
    #!/bin/bash
    #Author:chenhj
    #Blog:https://www.cnblogs.com/woaiyunwei/
    #Time:2020-05-27 14:35:46
    #Name:for.creb.sh
    #Version:V1.0
    #Description:This is a test script.
    
    for n in {1..5}
    do
        if [ $n -eq 3 ]
        then
            break
        fi
        echo $n
    done
    echo ok
    
    [root@web01 /server/scripts]# sh for_cred.sh 
    1
    2
    ok
    #匹配到3就跳出循环
    =======================================
    #return 退出当前函数循环,执行下一个函数 
    [root@web01 /server/scripts]# cat for_cred.sh 
    #!/bin/bash
    #Author:chenhj
    #Blog:https://www.cnblogs.com/woaiyunwei/
    #Time:2020-05-27 14:35:46
    #Name:for.creb.sh
    #Version:V1.0
    #Description:This is a test script.
    
    function main(){
        for n in {1..5}
        do
            if [ $n -eq 3 ]
            then
                return 
            fi
            echo $n
        done
    }
    
    function echo_ret(){
       echo "server ok"   
    }
    main
    echo ok
    echo_ret
    [root@web01 /server/scripts]# sh for_cred.sh 
    1
    2
    ok
    server ok
    ===============================================
    #exit 直接退出脚本
    [root@web01 /server/scripts]# cat   for_cred.sh 
    #!/bin/bash
    #Author:chenhj
    #Blog:https://www.cnblogs.com/woaiyunwei/
    #Time:2020-05-27 14:35:46
    #Name:for.creb.sh
    #Version:V1.0
    #Description:This is a test script.
    
    function main(){
        for n in {1..5}
        do
            if [ $n -eq 3 ]
            then
                exit 
            fi
            echo $n
        done
    }
    
    function echo_ret(){
       echo "server ok"   
    }
    main
    echo ok
    echo_ret
    [root@web01 /server/scripts]# sh for_cred.sh 
    1
    2
    
    1. 分析Nginx访问日志中每行的访问字节数对应的字段相加,计算出的总访问量
    [root@web01 /server/scripts]# cat for.acc.sh 
    #!/bin/bash
    #Author:chenhj
    #Blog:https://www.cnblogs.com/woaiyunwei/
    #Time:2020-05-27 14:16:37
    #Name:for.acc.sh
    #Version:V1.0
    #Description:This is a test script.
    sum=0
    for i in `awk '{print $10}' access.log`
    do
        if [[ ! $i =~ ^[0-9]+$ ]]
        then
            continue
        else
           ((sum=sum+i))
        fi
    done
    echo $sum
    =================================================
    [root@web01 /server/scripts]# sh for.acc.sh 
    2111
    
  • 相关阅读:
    深度学习分类网络的发展历史
    杨辉三角
    【了解】贝塞尔曲线
    win10桌面点击事件蓝色边框处理
    try{}catch的隐藏(如何优雅的实现异常块)
    switch的一些思考(seitch与ifelse的区别)
    好看的控制台日志线
    Serializable和Externalizabl的异同
    java排序方式对比
    如何初始化Map,java
  • 原文地址:https://www.cnblogs.com/woaiyunwei/p/12973604.html
Copyright © 2011-2022 走看看