<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          17 個(gè)實(shí)用 shell 腳本,建議收藏!

          共 23669字,需瀏覽 48分鐘

           ·

          2022-02-13 12:47

          作者:民工哥

          來源:SegmentFault  思否社區(qū) 


          1、服務(wù)器系統(tǒng)配置初始化



          #/bin/bash
          # 安裝系統(tǒng)性能分析工具及其他
          yum install gcc make autoconf vim sysstat net-tools iostat iftop iotp wget lrzsz lsof unzip openssh-clients net-tool vim ntpdate -y
          # 設(shè)置時(shí)區(qū)并同步時(shí)間
          ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
          if ! crontab -l |grep ntpdate &>/dev/null ; then
              (echo "* 1 * * * ntpdate time.windows.com >/dev/null 2>&1";crontab -l) |crontab 
          fi
           
          # 禁用selinux
          sed -i '/SELINUX/{s/permissive/disabled/}' /etc/selinux/config
           
          # 關(guān)閉防火墻
          if egrep "7.[0-9]" /etc/redhat-release &>/dev/null; then
              systemctl stop firewalld
              systemctl disable firewalld
          elif egrep "6.[0-9]" /etc/redhat-release &>/dev/null; then
              service iptables stop
              chkconfig iptables off
          fi
           
          # 歷史命令顯示操作時(shí)間
          if ! grep HISTTIMEFORMAT /etc/bashrc; then
              echo 'export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S  `whoami` "' >> /etc/bashrc
          fi
           
          # SSH超時(shí)時(shí)間
          if ! grep "TMOUT=600" /etc/profile &>/dev/null; then
              echo "export TMOUT=600" >> /etc/profile
          fi
           
          # 禁止root遠(yuǎn)程登錄 切記給系統(tǒng)添加普通用戶,給su到root的權(quán)限
          sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config
           
          # 禁止定時(shí)任務(wù)向發(fā)送郵件
          sed -i 's/^MAILTO=root/MAILTO=""/' /etc/crontab 
           
          # 設(shè)置最大打開文件數(shù)
          if ! grep "* soft nofile 65535" /etc/security/limits.conf &>/dev/null; then
          cat >> /etc/security/limits.conf << EOF
              * soft nofile 65535
              * hard nofile 65535
          EOF
          fi
           
          # 系統(tǒng)內(nèi)核優(yōu)化
          cat >> /etc/sysctl.conf << EOF
          net.ipv4.tcp_syncookies = 1
          net.ipv4.tcp_max_tw_buckets = 20480
          net.ipv4.tcp_max_syn_backlog = 20480
          net.core.netdev_max_backlog = 262144
          net.ipv4.tcp_fin_timeout = 20  
          EOF
           
          # 減少SWAP使用
          echo "0" > /proc/sys/vm/swappiness

          2、批量創(chuàng)建多個(gè)用戶并設(shè)置密碼



          #!/bin/bash
          USER_LIST=$@
          USER_FILE=./user.info
          for USER in $USER_LIST;do
              if ! id $USER &>/dev/null; then
                  PASS=$(echo $RANDOM |md5sum |cut -c 1-8)
                  useradd $USER
                  echo $PASS | passwd --stdin $USER &>/dev/null
                  echo "$USER   $PASS" >> $USER_FILE
                  echo "$USER User create successful."
              else
                  echo "$USER User already exists!"
              fi
          done

          3、一鍵查看服務(wù)器利用率



          #!/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相應(yīng)使用率:${iowait}:${iowait}%"
           
          }
          function memory (){
           
              total=`free -m |awk '{if(NR==2)printf "%.1f",$2/1024}'`
              used=`free -m |awk '{if(NR==2) printf "%.1f",($2-$NF)/1024}'`
              available=`free -m |awk '{if(NR==2) printf "%.1f",$NF/1024}'`
              echo "內(nèi)存 - 總大小: ${total}G , 使用: ${used}G , 剩余: ${available}G"
          }
          disk(){
              
              fs=$(df -h |awk '/^\/dev/{print $1}')
              for p in $fsdo
                  mounted=$(df -h |awk '$1=="'$p'"{print $NF}')
                  size=$(df -h |awk '$1=="'$p'"{print $2}')
                  used=$(df -h |awk '$1=="'$p'"{print $3}')
                  used_percent=$(df -h |awk '$1=="'$p'"{print $5}')
                  echo "硬盤 - 掛載點(diǎn): $mounted , 總大小: $size , 使用: $used , 使用率: $used_percent"
              done
           
          }
          function tcp_status() {
              summary=$(ss -antp |awk '{status[$1]++}END{for(i in status) printf i":"status[i]" "}')
              echo "TCP連接狀態(tài) - $summary"
          }
          cpu
          memory
          disk
          tcp_status

          4、找出占用CPU 內(nèi)存過高的進(jìn)程



          #!/bin/bash
          echo "-------------------CUP占用前10排序--------------------------------"
          ps -eo user,pid,pcpu,pmem,args --sort=-pcpu  |head -n 10
          echo "-------------------內(nèi)存占用前10排序--------------------------------"
          ps -eo user,pid,pcpu,pmem,args --sort=-pmem  |head -n 10

          5、查看網(wǎng)卡的實(shí)時(shí)流量



          #!/bin/bash
          eth0=$1
          echo  -e    "流量進(jìn)入--流量傳出    "
          while truedo
              old_in=$(cat /proc/net/dev |grep $eth0 |awk '{print $2}')
              old_out=$(cat /proc/net/dev |grep $eth0 |awk '{print $10}')
              sleep 1
              new_in=$(cat /proc/net/dev |grep $eth0 |awk '{print $2}')
              new_out=$(cat /proc/net/dev |grep $eth0 |awk '{print $10}')
              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

          6、監(jiān)控多臺(tái)服務(wù)器磁盤利用率腳本



          #!/bin/bash
          HOST_INFO=host.info
          for IP in $(awk '/^[^#]/{print $1}' $HOST_INFO); do
              #取出用戶名和端口
              USER=$(awk -v ip=$IP 'ip==$1{print $2}' $HOST_INFO)
              PORT=$(awk -v ip=$IP 'ip==$1{print $3}' $HOST_INFO)
              #創(chuàng)建臨時(shí)文件,保存信息
              TMP_FILE=/tmp/disk.tmp
              #通過公鑰登錄獲取主機(jī)磁盤信息
              ssh -p $PORT $USER@$IP 'df -h' > $TMP_FILE
              #分析磁盤占用空間
              USE_RATE_LIST=$(awk 'BEGIN{OFS="="}/^\/dev/{print $NF,int($5)}' $TMP_FILE)
              #循環(huán)磁盤列表,進(jìn)行判斷
              for USE_RATE in $USE_RATE_LISTdo
                  #取出等號(=)右邊的值 掛載點(diǎn)名稱
                  PART_NAME=${USE_RATE%=*}  
                  #取出等號(=)左邊的值  磁盤利用率
                  USE_RATE=${USE_RATE#*=}
                  #進(jìn)行判斷
                  if [ $USE_RATE -ge 80 ]; then
                      echo "Warning: $PART_NAME Partition usage $USE_RATE%!"
                       echo "服務(wù)器$IP的磁盤空間占用過高,請及時(shí)處理" | mail -s "空間不足警告" 你的[email protected]
                  else
                      echo "服務(wù)器$IP$PART_NAME目錄空間良好"
                  fi
              done
          done

          7、批量檢測網(wǎng)站是否異常并郵件通知



          #!/bin/bash  
          URL_LIST="www.baidu.com www.ctnrs.com www.der-matech.net.cn www.der-matech.com.cn www.der-matech.cn www.der-matech.top www.der-matech.org"
          for URL in $URL_LISTdo
              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 "$URL retry $FAIL_COUNT"
                      let FAIL_COUNT++
                  fi
              done
              if [ $FAIL_COUNT -eq 3 ]; then
                  echo "Warning: $URL Access failure!"
                  echo "網(wǎng)站$URL壞掉,請及時(shí)處理" | mail -s "$URL網(wǎng)站高危" [email protected]
              fi
          done

          8、批量主機(jī)遠(yuǎn)程執(zhí)行命令腳本



          #!/bin/bash
          COMMAND=$*
          HOST_INFO=host.info
          for IP in $(awk '/^[^#]/{print $1}' $HOST_INFO); do
              USER=$(awk -v ip=$IP 'ip==$1{print $2}' $HOST_INFO)
              PORT=$(awk -v ip=$IP 'ip==$1{print $3}' $HOST_INFO)
              PASS=$(awk -v ip=$IP 'ip==$1{print $4}' $HOST_INFO)
              expect -c "
                 spawn ssh -p $PORT $USER@$IP
                 expect {
                    \"(yes/no)\" {send \"yes\r\"; exp_continue}
                    \"password:\" {send \"$PASS\r\"; exp_continue}
                    \"$USER@*\" {send \"$COMMAND\r exit\r\"; exp_continue}
                 }
              "

              echo "-------------------"
          done

          9、一鍵部署LNMP網(wǎng)站平臺(tái)腳本



          #!/bin/bash
          NGINX_V=1.15.6
          PHP_V=5.6.36
          TMP_DIR=/tmp
           
          INSTALL_DIR=/usr/local
           
          PWD_C=$PWD
           
          echo
          echo -e "\tMenu\n"
          echo -e "1. Install Nginx"
          echo -e "2. Install PHP"
          echo -e "3. Install MySQL"
          echo -e "4. Deploy LNMP"
          echo -e "9. Quit"
           
          function command_status_check() {
              if [ $? -ne 0 ]; then
                  echo $1
                  exit
              fi 
          }
           
          function install_nginx() {
              cd $TMP_DIR
              yum install -y gcc gcc-c++ make openssl-devel pcre-devel wget
              wget http://nginx.org/download/nginx-${NGINX_V}.tar.gz
              tar zxf nginx-${NGINX_V}.tar.gz
              cd nginx-${NGINX_V}
              ./configure --prefix=$INSTALL_DIR/nginx \
              --with-http_ssl_module \
              --with-http_stub_status_module \
              --with-stream
              command_status_check "Nginx - 平臺(tái)環(huán)境檢查失敗!"
              make -j 4 
              command_status_check "Nginx - 編譯失敗!"
              make install
              command_status_check "Nginx - 安裝失敗!"
              mkdir -p $INSTALL_DIR/nginx/conf/vhost
              alias cp=cp ; cp -rf $PWD_C/nginx.conf $INSTALL_DIR/nginx/conf
              rm -rf $INSTALL_DIR/nginx/html/*
              echo "ok" > $INSTALL_DIR/nginx/html/status.html
              echo '<?php echo "ok"?>' > $INSTALL_DIR/nginx/html/status.php
              $INSTALL_DIR/nginx/sbin/nginx
              command_status_check "Nginx - 啟動(dòng)失敗!"
          }
           
          function install_php() {
              cd $TMP_DIR
              yum install -y gcc gcc-c++ make gd-devel libxml2-devel \
                  libcurl-devel libjpeg-devel libpng-devel openssl-devel \
                  libmcrypt-devel libxslt-devel libtidy-devel
              wget http://docs.php.net/distributions/php-${PHP_V}.tar.gz
              tar zxf php-${PHP_V}.tar.gz
              cd php-${PHP_V}
              ./configure --prefix=$INSTALL_DIR/php \
              --with-config-file-path=$INSTALL_DIR/php/etc \
              --enable-fpm --enable-opcache \
              --with-mysql --with-mysqli --with-pdo-mysql \
              --with-openssl --with-zlib --with-curl --with-gd \
              --with-jpeg-dir --with-png-dir --with-freetype-dir \
              --enable-mbstring --enable-hash
              command_status_check "PHP - 平臺(tái)環(huán)境檢查失敗!"
              make -j 4 
              command_status_check "PHP - 編譯失敗!"
              make install
              command_status_check "PHP - 安裝失敗!"
              cp php.ini-production $INSTALL_DIR/php/etc/php.ini
              cp sapi/fpm/php-fpm.conf $INSTALL_DIR/php/etc/php-fpm.conf
              cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
              chmod +x /etc/init.d/php-fpm
              /etc/init.d/php-fpm start
              command_status_check "PHP - 啟動(dòng)失敗!"
          }
           
          read -p "請輸入編號:" number
          case $number in
              1)
                  install_nginx;;
              2)
                  install_php;;
              3)
                  install_mysql;;
              4)
                  install_nginx
                  install_php
                  ;;
              9)
                  exit;;
          esac

          10、監(jiān)控MySQL主從同步狀態(tài)是否異常腳本



          #!/bin/bash  
          HOST=localhost
          USER=root
          PASSWD=123.com
          IO_SQL_STATUS=$(mysql -h$HOST -u$USER -p$PASSWD -e 'show slave status\G' 2>/dev/null |awk '/Slave_.*_Running:/{print $1$2}')
          for i in $IO_SQL_STATUSdo
              THREAD_STATUS_NAME=${i%:*}
              THREAD_STATUS=${i#*:}
              if [ "$THREAD_STATUS" != "Yes" ]; then
                  echo "Error: MySQL Master-Slave $THREAD_STATUS_NAME status is $THREAD_STATUS!" |mail -s "Master-Slave Staus" [email protected]
              fi
          done

          11、MySql數(shù)據(jù)庫備份腳本



          分庫備份

          mysqldump -uroot -pxxx -B A > A.sql
          #!/bin/bash
          DATE=$(date +%F_%H-%M-%S)
          HOST=localhost
          USER=backup
          PASS=123.com
          BACKUP_DIR=/data/db_backup
          DB_LIST=$(mysql -h$HOST -u$USER -p$PASS -s -e "show databases;" 2>/dev/null |egrep -v "Database|information_schema|mysql|performance_schema|sys")
           
          for DB in $DB_LISTdo
              BACKUP_NAME=$BACKUP_DIR/${DB}_${DATE}.sql
              if ! mysqldump -h$HOST -u$USER -p$PASS -B $DB > $BACKUP_NAME 2>/dev/null; then
                  echo "$BACKUP_NAME 備份失敗!"
              fi
          done

          分表備份

          mysqldump -uroot -pxxx -A t > t.sql
          #!/bin/bash
          DATE=$(date +%F_%H-%M-%S)
          HOST=localhost
          USER=backup
          PASS=123.com
          BACKUP_DIR=/data/db_backup
          DB_LIST=$(mysql -h$HOST -u$USER -p$PASS -s -e "show databases;" 2>/dev/null |egrep -v "Database|information_schema|mysql|performance_schema|sys")
           
          for DB in $DB_LISTdo
              BACKUP_DB_DIR=$BACKUP_DIR/${DB}_${DATE}
              [ ! -d $BACKUP_DB_DIR ] && mkdir -p $BACKUP_DB_DIR &>/dev/null
              TABLE_LIST=$(mysql -h$HOST -u$USER -p$PASS -s -e "use $DB;show tables;" 2>/dev/null)
              for TABLE in $TABLE_LISTdo
                  BACKUP_NAME=$BACKUP_DB_DIR/${TABLE}.sql 
                  if ! mysqldump -h$HOST -u$USER -p$PASS $DB $TABLE > $BACKUP_NAME 2>/dev/null; then
                      echo "$BACKUP_NAME 備份失敗!"
                  fi
              done
          done

          12、Nginx訪問日志分析



          #!/bin/bash
          # 日志格式: $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"
          LOG_FILE=$1
          echo "統(tǒng)計(jì)訪問最多的10個(gè)IP"
          awk '{a[$1]++}END{print "UV:",length(a);for(v in a)print v,a[v]}' $LOG_FILE |sort -k2 -nr |head -10
          echo "----------------------"
           
          echo "統(tǒng)計(jì)時(shí)間段訪問最多的IP"
          awk '$4>="[01/Dec/2018:13:20:25" && $4<="[27/Nov/2018:16:20:49"{a[$1]++}END{for(v in a)print v,a[v]}' $LOG_FILE |sort -k2 -nr|head -10
          echo "----------------------"
           
          echo "統(tǒng)計(jì)訪問最多的10個(gè)頁面"
          awk '{a[$7]++}END{print "PV:",length(a);for(v in a){if(a[v]>10)print v,a[v]}}' $LOG_FILE |sort -k2 -nr
          echo "----------------------"
           
          echo "統(tǒng)計(jì)訪問頁面狀態(tài)碼數(shù)量"
          awk '{a[$7" "$9]++}END{for(v in a){if(a[v]>5)print v,a[v]}}' $LOG_FILE |sort -k3 -nr


          13、Nginx訪問日志自動(dòng)按天(周、月)切割



          #!/bin/bash
          #nginx日志目錄
          LOG_DIR=/www/server/nginx/logs
          #獲取到上一天的時(shí)間
          YESTERDAY_TIME=$(date -d "yesterday" +%F)
          #歸檔日志取時(shí)間
          LOG_MONTH_DIR=$LOG_DIR/$(date +"%Y-%m")
          #歸檔日志的名稱
          LOG_FILE_LIST="access.log"
           
          for LOG_FILE in $LOG_FILE_LISTdo
              [ ! -d $LOG_MONTH_DIR ] && mkdir -p $LOG_MONTH_DIR
              mv $LOG_DIR/$LOG_FILE $LOG_MONTH_DIR/${LOG_FILE}_${YESTERDAY_TIME}
          done
           
          kill -USR1 $(cat $LOG_DIR/nginx.pid)

          14、自動(dòng)發(fā)布Java項(xiàng)目(Tomcat)



          #!/bin/bash
          DATE=$(date +%F_%T)
           
          TOMCAT_NAME=$1
          TOMCAT_DIR=/usr/local/$TOMCAT_NAME
          ROOT=$TOMCAT_DIR/webapps/ROOT
           
          BACKUP_DIR=/data/backup
          WORK_DIR=/tmp
          PROJECT_NAME=tomcat-java-demo
           
          # 拉取代碼
          cd $WORK_DIR
          if [ ! -d $PROJECT_NAME ]; then
             git clone https://github.com/lizhenliang/tomcat-java-demo
             cd $PROJECT_NAME
          else
             cd $PROJECT_NAME
             git pull
          fi
           
          # 構(gòu)建
          mvn clean package -Dmaven.test.skip=true
          if [ $? -ne 0 ]; then
             echo "maven build failure!"
             exit 1
          fi
           
          # 部署
          TOMCAT_PID=$(ps -ef |grep "$TOMCAT_NAME" |egrep -v "grep|$$" |awk 'NR==1{print $2}')
          [ -n "$TOMCAT_PID" ] && kill -9 $TOMCAT_PID
          [ -d $ROOT ] && mv $ROOT $BACKUP_DIR/${TOMCAT_NAME}_ROOT$DATE
          unzip $WORK_DIR/$PROJECT_NAME/target/*.war -d $ROOT
          $TOMCAT_DIR/bin/startup.sh

          15、自動(dòng)發(fā)布PHP項(xiàng)目



          #!/bin/bash
           

          DATE=$(date +%F_%T)
           
          WWWROOT=/usr/local/nginx/html/$1
           
           
          BACKUP_DIR=/data/backup
          WORK_DIR=/tmp
          PROJECT_NAME=php-demo
           
           
          # 拉取代碼
          cd $WORK_DIR
          if [ ! -d $PROJECT_NAME ]; then
             git clone https://github.com/lizhenliang/php-demo
             cd $PROJECT_NAME
          else
             cd $PROJECT_NAME
             git pull
          fi
           
           
          # 部署
          if [ ! -d $WWWROOT ]; then
             mkdir -p $WWWROOT
             rsync -avz --exclude=.git $WORK_DIR/$PROJECT_NAME/* $WWWROOT
          else
             rsync -avz --exclude=.git $WORK_DIR/$PROJECT_NAME/* $WWWROOT
          fi

          16、DOS攻擊防范(自動(dòng)屏蔽攻擊IP)



          #!/bin/bash
          DATE=$(date +%d/%b/%Y:%H:%M)
          #nginx日志
          LOG_FILE=/usr/local/nginx/logs/demo2.access.log
          #分析ip的訪問情況
          ABNORMAL_IP=$(tail -n5000 $LOG_FILE |grep $DATE |awk '{a[$1]++}END{for(i in a)if(a[i]>10)print i}')
          for IP in $ABNORMAL_IPdo
              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

          17、目錄入侵檢測與告警



          #!/bin/bash
           

          MON_DIR=/opt
          inotifywait -mqr --format %f -e create $MON_DIR |\
          while read files; do
             #同步文件
             rsync -avz /opt /tmp/opt
            #檢測文件是否被修改
             #echo "$(date +'%F %T') create $files" | mail -s "dir monitor" [email protected]
          done

          作者:南宮乘風(fēng)
          鏈接:blog.csdn.net/heian_99/article/details/104027379



          點(diǎn)擊左下角閱讀原文,到 SegmentFault 思否社區(qū) 和文章作者展開更多互動(dòng)和交流,掃描下方”二維碼“或在“公眾號后臺(tái)回復(fù)“ 入群 ”即可加入我們的技術(shù)交流群,收獲更多的技術(shù)文章~

          - END -


          瀏覽 33
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  a√在线看 | 成人无码视频网站 | 少女的报答-戚小怜 | 91超碰免费 | 色哟哟哟 入口国产精品 |