• shell脚本1


    一、安装基本环境(跟据实际情况添加修改)

     1 #!/bin/bash
     2 yum install -y lrzsz  bash-completion  wget  vim
     3 echo  "安装完成"
     4 
     5 rm    -rf    /etc/yum.repos.d/*
     6 wget  http://mirrors.aliyun.com/repo/Centos-7.repo  -O /etc/yum.repos.d/CentOS-Base.repo
     7 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
     8 yum makecache
     9 echo "yum finish"
    10 sed -ri '/^#UseDNS/cUseDNS no' /etc/ssh/sshd_config
    11 sed -ri '/SELINUX=enforcing/cSELINUX=disabled' /etc/selinux/config
    12 systemctl stop fireawlld   systemctl disable firewalld
    13 echo   "selinux finish"

    二、简单系统工具

    #!/bin/bash
    # system tools
    # v1
    menu() {
          cat <<-EOF
    +-----------------------------------+
     H:help of menu
     F:display disk partition
     D:filesystem mount
     M:memory info
     U:system load
     I: check to see if all hosts
     Q:exit
    +-----------------------------------+
        EOF
    }
    mem_use() {
        mem_used=`free -m | grep "^Mem" | awk '{print $3}'`
        mem_total=`free -m | grep "^Mem" | awk '{print $2}'`
        mem_percent=$((mem_used*100/mem_total))
        echo "${mem_percent}%"
    }
    
    ip_check() {
      for i in {2..20}
      do
         ip=192.168.8.$i
         ping -c 1 -w1 $ip &>/dev/null
         if [ $? -eq 0 ];then
             echo "$ip" >>/tmp/ip_online.txt
         else
             echo "$ip" >>/tmp/ip_notonline.txt
         fi
      done
    }
    
    while :
    do     
            menu
        read -p "please choose:" action
    
        case "$action" in
        h|H)
            menu
            ;;
        f|F)
            fdisk -l
            disk_info=`df -h | grep "/$" | awk '{print $(NF-1)}'`
                echo "磁盘剩余空间为:$disk_info"
            ;;
        d|D)
            mount
            ;;
        m|M)
           free -m
              mem=$(mem_use)
          echo "剩余内存百分比为:$mem"
           ;;
        u|U)
           uptime
           ;;
        q|Q)
           break
           ;;
            I|i)
               ip_check
               if [ $? -eq 0 ];then
                  echo "check finish"
               else
                  echo "eheck fiald"
               fi
           ;;
            
             "")
           echo "请重新输入!!"
           ;;
          *)
           menu
        esac
    done
    

     三、tomcat启动脚本

    #!/bin/bash
    JAVA_HOME=/usr/local/jdk1.8/
    JAVA_BIN=/usr/local/jdk1.8/bin
    JRE_HOME=/usr/local/jdk1.8/jre
    PATH=$PATH:/usr/local/jdk1.8/bin:/usr/local/jdk1.8/jre/bin
    CLASSPATH=/usr/local/jdk1.8/jre/lib:/usr/local/jdk1.8/lib:/usr/local/jdk1.8/jre/lib/charsets.jar
    TOMCAT_BIN=/usr/local/tomcat/bin
    RETVAL=0
    prog="Tomcat"
    start()
    {
       echo "Starting $prog......"
       /bin/bash $TOMCAT_BIN/startup.sh
       RETVAL=$?
       return $RETVAL
    }
    stop()
    {
       echo "Stopping $prog......"
       /bin/bash $TOMCAT_BIN/shutdown.sh
       RETVAL=$?
       return $RETVAL
    }
    restart(){
       echo "Restarting $prog......"
       stop
       start
    }
    case "$1" in
       start)
            start
            ;;
       stop)
           stop
           ;;
       restart)
           restart
           ;;
       *)
           echo $"Usage: $0 {start|stop|restart}"
           RETVAL=1
    esac
    exit $RETVAL

    四、统计内存使用

     1 #!/bin/bash
     2 count=0
     3 # 这个循环会遍历出每个进程占用的内存大小
     4 for i in `ps aux |awk '{print $6}' |grep -v 'RSS'`
     5 do
     6    # 将遍历出来的数字进行累加
     7    count=$[$count+$i]
     8 done
     9 # 就得到所有进程占用内存大小的和了
    10 echo "$count/kb"
    11 
    12 或者  ps aux |grep -v 'RSS TTY' |awk '{sum=sum+$6};END{print sum}'

    五、备份数据库

    #!/bin/bash
    PATH=$PATHi:/usr/local/mysql/bin
    week=`date +%w`
    today=`date +d`
    passwd="123456"
    backdir="/data/mysql"
    r_backupIP="192.168.123.30::backup"
    exec 1>/var/log/mysqlbak.log 2>/var/log/mysqlbak.log
    echo "mysql backup begin at `date +%F %T`."
    # 本地备份
    mysqldump -uroot -p$passwd --default-character-set=utf8 discuz >$backdir/$week.sql
    # 同步备份到远程机器
    rsync -az $backdir/$week.sql $r_backupIP/$today.sql
    echo "mysql backup end at `date +%F %T`."
    
    然后加入cron
    0 3 * * * /bin/bash /usr/local/sbin/mysqlbak.sh
    

    六、自动重启php-fpm服务

    #!/bin/bash
    access_log="/data/log/access.log"
    N=10
    while :
    do
       # 因为10秒大概产生300条日志记录
       tail -n300 $access_log > /tmp/log
       # 拿出log中包含502的日志行数
       n_502=`grep -c "502" /tmp/log`
       # 如果行数大于10
       if [ $n_502 -ge $N ]
       then
          # 就记录一下系统状态
          top -bn1 > /tmp/`date +%H%M%S`-top.log
          vmstat 1 5 > /tmp/`date +%H%M%S`-vm.log
          # 然后才重启服务,并把错误信息重定向
          /etc/init.d/php-fpm restart 2> /dev/null
          # 重启php-fpm服务后,应先暂缓1分钟,而后继续每隔10s检测一次
          sleep(60)
       fi
     sleep(10)
    done
    

    七、禁止恶意访问ip

    #!/bin/bash
    ## 日志文件路径
    log_file="/home/logs/client/access.log"
    ## 当前时间减一分钟的时间
    d1=`date -d "-1 minute" +%H:%M`
    ## 当前时间的分钟段
    d2=`date +%M`
    ## iptables命令所在的路径
    ipt="/sbin/iptables"
    ## 用于存储访问日志里的ip
    ips="/tmp/ips.txt"
    ## 封ip
    block(){
       ## 把日志文件中的ip过滤出来,去掉重复的ip,并统计ip的重复次数以及对ip进行排序,最后将结果写到一个文件中
       grep "$d1:" $log_file |awk '{print $1}' |sort -n |uniq -c |sort -n > $ips
       ## 将文件里重复次数大于100的ip迭代出来
       for ip in `awk '$1 > 100 {print $2}' $ips`
       do
          ## 通过防火墙规则对这些ip进行封禁
          $ipt -I INPUT -p -tcp --dport 80 -s $ip -j REJECT
          ## 将已经封禁的ip输出到一个文件里存储
          echo "`date +%F-%T` $ip" >> /tmp/badip.txt
       done
    }
    ## 解封ip
    unblock(){
       ## 将流量小于15的规则索引过滤出来
       for i in `$ipt -nvL --line-number |grep '0.0.0.0/0' |awk '$2 < 15 {print $1}' |sort -nr`
       do
          ## 通过索引来删除规则
          $ipt -D INPUT $i
       done
       ## 清空规则中的数据包计算器和字节计数器
       $ipt -Z
    }
    ## 为整点或30分钟就是过了半个小时,就需要再进行分析
    if [ $d2 == "00" ] || [ $d2 == "30" ]
    then
       unblock
       block
    else
       block
    fi
    

     八、统计常用命令

     sort /root/.bash_history |uniq -c |sort -nr |head -10 (-n 依照数值的大小排序 -r 以降序来排序)

    九、系统-批量杀进程

     ps aux |grep clearmem.sh |grep -v grep|awk '{print $2}'|xargs kill 

    十、监控mysql服务

    假设,当前MySQL服务的root密码为123456,写脚本检测MySQL服务是否正常(比如,可以正常进入mysql执行show processlist),并检测一下当前的MySQL服务是主还是从,如果是从,请判断它的主从服务是否异常。如果是主,则不需要做什么。
    #!/bin/bash
    Mysql_c="mysql -uroot -p123456"
    $Mysql_c -e "show processlist" >/tmp/mysql_pro.log 2>/tmp/mysql_log.err
    n=`wc -l /tmp/mysql_log.err|awk '{print $1}'`
     
    if [ $n -gt 0 ]
    then
        echo "mysql service sth wrong."
    else
        $Mysql_c -e "show slave statusG" >/tmp/mysql_s.log
        n1=`wc -l /tmp/mysql_s.log|awk '{print $1}'`
     
        if [ $n1 -gt 0 ]
        then
            y1=`grep 'Slave_IO_Running:' /tmp/mysql_s.log|awk -F : '{print $2}'|sed 's/ //g'`
            y2=`grep 'Slave_SQL_Running:' /tmp/mysql_s.log|awk -F : '{print $2}'|sed 's/ //g'`
     
            if [ $y1 == "Yes" ] && [ $y2 == "Yes" ]
            then
                echo "slave status good."
            else
                echo "slave down."
            fi
        fi
    fi

    十一、抽签脚本

    while :
    do
        read -p  "Please input a name:" name
        if [ -f /work/test/1.log ];then
        bb=`cat /work/test/1.log | awk -F: '{print $1}' | grep "$name"`
     
        if [ "$bb" != "$name" ];then  #名字不重复情况下
            aa=`echo $RANDOM | awk -F "" '{print $2 $3}'`
            while :
            do
              dd=`cat  /work/test/1.log |  awk -F: '{print $2}'  | grep "$aa"`
              if [ "$aa"  ==  "$dd" ];then   #数字已经存在情况下
                  echo "数字已存在."
                  aa=`echo $RANDOM | awk -F "" '{print $2 $3}'`
              else
                  break
              fi
            done
            echo "$name:$aa" | tee -a /work/test/1.log
         else
         aa=`cat /work/test/1.log |  grep "$name" | awk -F: '{print $2}'` #名字重复
         echo $aa
         echo "重复名字."
         fi
      else
          aa=`echo $RANDOM | awk -F "" '{print $2 $3}'`
          echo "$name:$aa" | tee -a  /work/test/1.log
      fi
    done

    十二、检测脚本是否有误

    #!/bin/bash
    sh -n $1 2>/tmp/err  ($1指某一个具体脚本)
    if [ $? -eq "0" ]
    then
        echo "The script is OK."
    else
        cat /tmp/err
        read -p "Please inpupt Q/q to exit, or others to edit it by vim. " n
        if [ -z $n ]
        then
            vim $1
            exit
        fi
        if [ $n == "q" -o $n == "Q" ]
        then
            exit
        else
            vim $1
            exit
        fi
     fi

    十三、判断cpu厂商

    #!/bin/bash
    m=`cat /proc/cpuinfo |grep vendor_id|awk  -F":" '{print $2}'|tail -1`
    if [ $m == "GenuineIntel" ]
    then
         echo "cpu is 英特尔"
    elif [ $m == "AuthenticAMD" ]
    then
         echo "cpu is AMD"
    else
         echo "cpu is 非主流"
    fi
    

    十四、调用其他shell脚本

    [root@zjz ~]# vim a.sh
    [root@zjz ~]# bash b.sh
    hello zhangjingzhi
    [root@zjz ~]# tail   a.sh   b.sh  (对比)
    ==> a.sh <==
    hello () {
         echo hello zhangjingzhi
    }
    
    ==> b.sh <==
    .  ./a.sh   (调用a.sh,相对路径)
    hello
    
  • 相关阅读:
    【JZOJ5771】遨游【二分】【DFS】
    【JZOJ5773】简单数学题【数论,数学】
    【JZOJ5773】简单数学题【数论,数学】
    有效壳第2部分:成为一个剪贴板体操运动员
    具有多重选择和列表间拖拽的拖拽列表框
    将枚举绑定到下拉列表框并根据值对其排序
    一个具有子项格式的自定义绘制列表控件
    基本的c#屏幕截图应用程序
    将组合框下拉列表宽度调整为最长字符串宽度
    在应用程序中使用按钮控件
  • 原文地址:https://www.cnblogs.com/zjz20/p/11644555.html
Copyright © 2020-2023  润新知