当前位置:
首页>教程分享>服务器教程>云服务器非常实用的9个Linux Shell脚本实例
1、Dos 攻击防范(自动屏蔽攻击 IP)
#!/bin/bashDATE=$(date +%d/%b/%Y:%H:%M)LOG_FILE=/usr/local/nginx/logs/demo2.access.logABNORMAL_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 fidone
2、Linux 系统发送告警脚本
# yum install mailx# vi /etc/mail.rcset [email protected] smtp=smtp.163.comset [email protected] smtp-auth-password=*******set smtp-auth=login
3、MySQL 数据库备份单循环
# yum install mailx# vi /etc/mail.rcset [email protected] smtp=smtp.163.comset [email protected] smtp-auth-password=*******set smtp-auth=login
4、MySQL 数据库备份多循环
#!/bin/bashDATE=$(date +%F_%H-%M-%S)HOST=localhostUSER=backupPASS=123.comBACKUP_DIR=/data/db_backupDB_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 donedone
5、Nginx 访问访问日志按天切割
#!/bin/bashLOG_DIR=/usr/local/nginx/logsYESTERDAY_TIME=$(date -d \"yesterday\" +%F)LOG_MONTH_DIR=$LOG_DIR/$(date +\"%Y-%m\")LOG_FILE_LIST=\"default.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}donekill -USR1 $(cat /var/run/nginx.pid)
6、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=$1echo \"统计访问最多的10个IP\"awk \'{a[$1]++}END{print \"UV:\",length(a);for(v in a)print v,a[v]}\' $LOG_FILE |sort -k2 -nr |head -10echo \"----------------------\"echo \"统计时间段访问最多的IP\"awk \'$4>=\"[01/Dec/2018:13:20:25\" && $410)print v,a[v]}}\' $LOG_FILE |sort -k2 -nrecho \"----------------------\"echo \"统计访问页面状态码数量\"awk \'{a[$7\" \"$9]++}END{for(v in a){if(a[v]>5)print v,a[v]}}\'
7、查看网卡实时流量脚本
#!/bin/bashNIC=$1echo -e \" In ------ Out\"while true; do OLD_IN=$(awk \'$0~\"\'$NIC\'\"{print $2}\' /proc/net/dev) OLD_OUT=$(awk \'$0~\"\'$NIC\'\"{print $10}\' /proc/net/dev) sleep 1 NEW_IN=$(awk \'$0~\"\'$NIC\'\"{print $2}\' /proc/net/dev) NEW_OUT=$(awk \'$0~\"\'$NIC\'\"{print $10}\' /proc/net/dev) 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\" sleep 1done
8、服务器系统配置初始化脚本
#/bin/bash# 设置时区并同步时间ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtimeif ! crontab -l |grep ntpdate &>/dev/null ; then (echo \"* 1 * * * ntpdate time.windows.com >/dev/null 2>&1\";crontab -l) |crontabfi# 禁用selinuxsed -i \'/SELINUX/{s/permissive/disabled/}\' /etc/selinux/config# 关闭防火墙if egrep \"7.[0-9]\" /etc/redhat-release &>/dev/null; then systemctl stop firewalld systemctl disable firewalldelif egrep \"6.[0-9]\" /etc/redhat-release &>/dev/null; then service iptables stop chkconfig iptables offfi# 历史命令显示操作时间if ! grep HISTTIMEFORMAT /etc/bashrc; then echo \'export HISTTIMEFORMAT=\"%F %T `whoami` \"\' >> /etc/bashrcfi# SSH超时时间if ! grep \"TMOUT=600\" /etc/profile &>/dev/null; then echo \"export TMOUT=600\" >> /etc/profilefi# 禁止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 <> /etc/sysctl.conf < /proc/sys/vm/swappiness# 安装系统性能分析工具及其他yum install gcc make autoconf vim sysstat net-tools iostat if
9、监控 100 台服务器磁盘利用率脚本
#!/bin/bashHOST_INFO=host.infofor 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%!\" fi donedone