【转】实用shell脚本 
            
              2021-12-13    2021-12-13    约 2775 字 
                  预计阅读 6 分钟 
         
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
  
#/bin/bash
 # 安装系统性能分析工具及其他
 yum   install   gcc   make   autoconf   vim   sysstat   net - tools   iostat   iftop   iotp   wget   lrzsz   lsof   unzip   openssh - clients   net - tool   vim   ntpdate   - y 
 # 设置时区并同步时间
 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 
  
 # 关闭防火墙
 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 
  
 # 历史命令显示操作时间
 if   !   grep   HISTTIMEFORMAT   / etc / bashrc ;   then 
      echo   'export HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S  `whoami` "'   >>   / etc / bashrc 
 fi 
  
 # SSH超时时间
 if   !   grep   "TMOUT=600"   / etc / profile   &>/ dev / null ;   then 
      echo   "export TMOUT=600"   >>   / etc / profile 
 fi 
  
 # 禁止root远程登录 切记给系统添加普通用户,给su到root的权限
 sed   - i   's/#PermitRootLogin yes/PermitRootLogin no/'   / etc / ssh / sshd_config 
  
 # 禁止定时任务向发送邮件
 sed   - i   's/^MAILTO=root/MAILTO=""/'   / etc / crontab  
  
 # 设置最大打开文件数
 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 
  
 # 系统内核优化
 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 
  
 
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
  
#!/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 
 
 
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
  
#!/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 } : ${ 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  "内存 - 总大小:  ${ total } G , 使用:  ${ used } G , 剩余:  ${ available } G" 
} 
disk(){ 
 
 fs = $( df -h | awk '/^\/dev/{print $1}' ) 
    for  p in $fs ;  do 
        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  "硬盘 - 挂载点:  $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连接状态 -  $summary " 
} 
cpu
memory
disk
tcp_status
 
 
1
 2
 3
 4
 5
  
#!/bin/bash
 echo  "-------------------CUP占用前10排序--------------------------------" 
ps -eo user,pid,pcpu,pmem,args --sort= -pcpu  | head -n 10 
echo  "-------------------内存占用前10排序--------------------------------" 
ps -eo user,pid,pcpu,pmem,args --sort= -pmem  | head -n 10 
 
 
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
  
#!/bin/bash
 eth0 = $1 
echo   -e    "流量进入--流量传出    " 
while  true;  do 
 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 
 
 
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
  
#!/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 ) 
 #创建临时文件,保存信息 
    TMP_FILE = /tmp/disk.tmp
 #通过公钥登录获取主机磁盘信息 
    ssh -p $PORT  $USER @$IP  'df -h'  > $TMP_FILE 
 #分析磁盘占用空间 
    USE_RATE_LIST = $( awk 'BEGIN{OFS="="}/^\/dev/{print $NF,int($5)}'  $TMP_FILE ) 
 #循环磁盘列表,进行判断 
    for  USE_RATE in $USE_RATE_LIST ;  do 
  #取出等号(=)右边的值 挂载点名称 
        PART_NAME = ${ USE_RATE %=* }   
  #取出等号(=)左边的值  磁盘利用率 
        USE_RATE = ${ USE_RATE #*= } 
  #进行判断 
        if  [  $USE_RATE  -ge 80  ] ;  then 
            echo  "Warning:  $PART_NAME  Partition usage  $USE_RATE %!" 
    echo  "服务器 $IP的磁盘空间占用过高 ,请及时处理"  |  mail -s "空间不足警告"  你的qq@qq.com
  else 
   echo  "服务器 $IP的$PART_NAME目录空间良好 " 
        fi 
    done 
done 
 
 
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
  
#!/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_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  " $URL  retry  $FAIL_COUNT " 
            let  FAIL_COUNT++
        fi 
    done 
    if  [  $FAIL_COUNT  -eq 3  ] ;  then 
        echo  "Warning:  $URL  Access failure!" 
  echo  "网站 $URL坏掉 ,请及时处理"  |  mail -s " $URL网站高危 "  1794748404@qq.com
    fi 
done 
 
 
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
  
#!/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 
 
 
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
  
#!/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 - 平台环境检查失败!" 
    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 - 启动失败!" 
} 
 
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 - 平台环境检查失败!" 
    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 - 启动失败!" 
} 
 
read  -p "请输入编号:"  number
case  $number  in
    1) 
        install_nginx;; 
    2) 
        install_php;; 
    3) 
        install_mysql;; 
    4) 
        install_nginx
        install_php
        ;; 
    9) 
        exit;; 
esac 
 
 
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
  
#!/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_STATUS ;  do 
    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"  xxx@163.com
    fi 
done 
 
 
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
  
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_LIST ;  do 
    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 
 
 
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
  
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_LIST ;  do 
    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_LIST ;  do 
        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 
 
 
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
  
#!/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  "统计访问最多的10个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  "统计时间段访问最多的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  "统计访问最多的10个页面" 
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  "统计访问页面状态码数量" 
awk '{a[$7" "$9]++}END{for(v in a){if(a[v]>5)print v,a[v]}}'  $LOG_FILE  | sort -k3 -nr
 
 
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
  
#!/bin/bash
 #nginx日志目录 
LOG_DIR = /www/server/nginx/logs
#获取到上一天的时间 
YESTERDAY_TIME = $( date -d "yesterday"  +%F) 
#归档日志取时间 
LOG_MONTH_DIR = $LOG_DIR /$( date +"%Y-%m" ) 
#归档日志的名称 
LOG_FILE_LIST = "access.log" 
 
for  LOG_FILE in $LOG_FILE_LIST ;  do 
    [  ! -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) 
 
 
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
  
#!/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 
 
# 构建 
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
 
 
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
  
#!/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 
 
 
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
  
#!/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_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 
 
 
 1
  2
  3
  4
  5
  6
  7
  8
  9
 10
  
#!/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" xxx@163.com 
done