9 个实用shell脚本

  • A+

1.Dos 攻击防范(自动屏蔽攻击 IP)

  1. #!/bin/bash  
  2. DATE=$(date +%d/%b/%Y:%H:%M)  
  3. LOG_FILE=/usr/local/nginx/logs/demo2.access.log  
  4. ABNORMAL_IP=$(tail -n5000 $LOG_FILE |grep $DATE |awk '{a[$1]++}END{for(i in a)if(a[i]>10)print i}')  
  5. for IP in $ABNORMAL_IPdo  
  6.     if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then  
  7.         iptables -I INPUT -s $IP -j DROP  
  8.         echo "$(date +'%F_%T') $IP" >> /tmp/drop_ip.log  
  9.     fi  
  10. done  

2.Linux 系统发送告警脚本

  1. # yum install mailx  
  2. # vi /etc/mail.rc  
  3. set from=baojingtongzhi@163.com smtp=smtp.163.com  
  4. set smtp-auth-user=netskyman@163.com smtp-auth-password=123456  
  5. set smtp-auth=login  

3.MySQL 数据库备份单循环

  1. #!/bin/bash  
  2. DATE=$(date +%F_%H-%M-%S)  
  3. HOST=localhost  
  4. USER=backup  
  5. PASS=123.com  
  6. BACKUP_DIR=/data/db_backup  
  7. 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")  
  8.   
  9. for DB in $DB_LISTdo  
  10.     BACKUP_NAME=$BACKUP_DIR/${DB}_${DATE}.sql  
  11.     if ! mysqldump -h$HOST -u$USER -p$PASS -B $DB > $BACKUP_NAME 2>/dev/null; then  
  12.         echo "$BACKUP_NAME 备份失败!"  
  13.     fi  
  14. done  

4.MySQL 数据库备份多循环

  1. #!/bin/bash  
  2. DATE=$(date +%F_%H-%M-%S)  
  3. HOST=localhost  
  4. USER=backup  
  5. PASS=123.com  
  6. BACKUP_DIR=/data/db_backup  
  7. 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")  
  8.   
  9. for DB in $DB_LISTdo  
  10.     BACKUP_DB_DIR=$BACKUP_DIR/${DB}_${DATE}  
  11.     [ ! -d $BACKUP_DB_DIR ] && mkdir -p $BACKUP_DB_DIR &>/dev/null  
  12.     TABLE_LIST=$(mysql -h$HOST -u$USER -p$PASS -s -e "use $DB;show tables;" 2>/dev/null)  
  13.     for TABLE in $TABLE_LISTdo  
  14.         BACKUP_NAME=$BACKUP_DB_DIR/${TABLE}.sql  
  15.         if ! mysqldump -h$HOST -u$USER -p$PASS $DB $TABLE > $BACKUP_NAME 2>/dev/null; then  
  16.             echo "$BACKUP_NAME 备份失败!"  
  17.         fi  
  18.     done  
  19. done  

5.Nginx 访问访问日志按天切割

  1. #!/bin/bash  
  2. LOG_DIR=/usr/local/nginx/logs  
  3. YESTERDAY_TIME=$(date -d "yesterday" +%F)  
  4. LOG_MONTH_DIR=$LOG_DIR/$(date +"%Y-%m")  
  5. LOG_FILE_LIST="default.access.log"  
  6.   
  7. for LOG_FILE in $LOG_FILE_LISTdo  
  8.     [ ! -d $LOG_MONTH_DIR ] && mkdir -p $LOG_MONTH_DIR  
  9.     mv $LOG_DIR/$LOG_FILE $LOG_MONTH_DIR/${LOG_FILE}_${YESTERDAY_TIME}  
  10. done  
  11.   
  12. kill -USR1 $(cat /var/run/nginx.pid)  

6.Nginx 访问日志分析脚本

  1. #!/bin/bash  
  2. # 日志格式: $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"  
  3. LOG_FILE=$1  
  4. echo "统计访问最多的10个IP"  
  5. awk '{a[$1]++}END{print "UV:",length(a);for(v in a)print v,a[v]}' $LOG_FILE |sort -k2 -nr |head -10  
  6. echo "----------------------"  
  7.   
  8. echo "统计时间段访问最多的IP"  
  9. 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  
  10. echo "----------------------"  
  11.   
  12. echo "统计访问最多的10个页面"  
  13. 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  
  14. echo "----------------------"  
  15.   
  16. echo "统计访问页面状态码数量"  
  17. awk '{a[$7" "$9]++}END{for(v in a){if(a[v]>5)print v,a[v]}}'  

7.查看网卡实时流量脚本

  1. #!/bin/bash  
  2. NIC=$1  
  3. echo -e " In ------ Out"  
  4. while true; do  
  5.     OLD_IN=$(awk '$0~"'$NIC'"{print $2}' /proc/net/dev)  
  6.     OLD_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev)  
  7.     sleep 1  
  8.     NEW_IN=$(awk  '$0~"'$NIC'"{print $2}' /proc/net/dev)  
  9.     NEW_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev)  
  10.     IN=$(printf "%.1f%s" "$((($NEW_IN-$OLD_IN)/1024))" "KB/s")  
  11.     OUT=$(printf "%.1f%s" "$((($NEW_OUT-$OLD_OUT)/1024))" "KB/s")  
  12.     echo "$IN $OUT"  
  13.     sleep 1  
  14. done  

8.服务器系统配置初始化脚本

  1. #/bin/bash  
  2. # 设置时区并同步时间  
  3. ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  
  4. if ! crontab -l |grep ntpdate &>/dev/null ; then  
  5.     (echo "* 1 * * * ntpdate time.windows.com >/dev/null 2>&1";crontab -l) |crontab  
  6. fi  
  7.   
  8. # 禁用selinux  
  9. sed -i '/SELINUX/{s/permissive/disabled/}' /etc/selinux/config  
  10.   
  11. # 关闭防火墙  
  12. if egrep "7.[0-9]" /etc/redhat-release &>/dev/null; then  
  13.     systemctl stop firewalld  
  14.     systemctl disable firewalld  
  15. elif egrep "6.[0-9]" /etc/redhat-release &>/dev/null; then  
  16.     service iptables stop  
  17.     chkconfig iptables off  
  18. fi  
  19.   
  20. # 历史命令显示操作时间  
  21. if ! grep HISTTIMEFORMAT /etc/bashrc; then  
  22.     echo 'export HISTTIMEFORMAT="%F %T `whoami` "' >> /etc/bashrc  
  23. fi  
  24.   
  25. # SSH超时时间  
  26. if ! grep "TMOUT=600" /etc/profile &>/dev/null; then  
  27.     echo "export TMOUT=600" >> /etc/profile  
  28. fi  
  29.   
  30. # 禁止root远程登录  
  31. sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config  
  32.   
  33. # 禁止定时任务向发送邮件  
  34. sed -i 's/^MAILTO=root/MAILTO=""/' /etc/crontab  
  35.   
  36. # 设置最大打开文件数  
  37. if ! grep "* soft nofile 65535" /etc/security/limits.conf &>/dev/null; then  
  38.     cat >> /etc/security/limits.conf << EOF  
  39.     * soft nofile 65535  
  40.     * hard nofile 65535  
  41. EOF  
  42. fi  
  43.   
  44. # 系统内核优化  
  45. cat >> /etc/sysctl.conf << EOF  
  46. net.ipv4.tcp_syncookies = 1  
  47. net.ipv4.tcp_max_tw_buckets = 20480  
  48. net.ipv4.tcp_max_syn_backlog = 20480  
  49. net.core.netdev_max_backlog = 262144  
  50. net.ipv4.tcp_fin_timeout = 20  
  51. EOF  
  52.   
  53. # 减少SWAP使用  
  54. echo "0" > /proc/sys/vm/swappiness  
  55.   
  56. # 安装系统性能分析工具及其他  
  57. yum install gcc make autoconf vim sysstat net-tools iostat if  

9.监控 100 台服务器磁盘利用率脚本

  1. #!/bin/bash  
  2. HOST_INFO=host.info  
  3. for IP in $(awk '/^[^#]/{print $1}' $HOST_INFO); do  
  4.     USER=$(awk -v ip=$IP 'ip==$1{print $2}' $HOST_INFO)  
  5.     PORT=$(awk -v ip=$IP 'ip==$1{print $3}' $HOST_INFO)  
  6.     TMP_FILE=/tmp/disk.tmp  
  7.     ssh -p $PORT $USER@$IP 'df -h' > $TMP_FILE  
  8.     USE_RATE_LIST=$(awk 'BEGIN{OFS="="}/^\/dev/{print $NF,int($5)}' $TMP_FILE)  
  9.     for USE_RATE in $USE_RATE_LISTdo  
  10.         PART_NAME=${USE_RATE%=*}  
  11.         USE_RATE=${USE_RATE#*=}  
  12.         if [ $USE_RATE -ge 80 ]; then  
  13.             echo "Warning: $PART_NAME Partition usage $USE_RATE%!"  
  14.         fi  
  15.     done  
  16. done  

moonrong
  • 版权声明:本站原创文章,于2022年11月15日17:08:21,由 发表,共 5614 字。
  • 版权声明: 本文由于2022年11月15日17:08:21 发表在 好派笔记,共 5614 字。

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: