Linux服务器超级实用的Shell脚本,建议收藏!
Shell 脚本是一种强大的工具,可以在各种领域中用于提高工作效率、简化任务和自动化常见工作流程。无论是系统管理、数据处理、任务自动化还是快速原型开发,Shell 脚本都是一种重要的编程工具。下面分享几个超级实用的 Shell 脚本。
1.使用INOTIFY+RSYNC自动实时同步数据
代码执行:bash inotify_rsyncs.sh
inotify_rsyncs.sh脚本内容如下:
#!/bin/bash # Author: Harry # chkconfig: - 85 15 # description: It is used to serve # 监测/data路径下的文件变化,排除Temp目录 INOTIFY_CMD="inotifywait -mrq -e modify,create,move,delete /data/ --exclude=Temp" # 同步数据 RSYNC_CMD1="rsync -avz /data/ --exclude-from=/etc/rc.d/init.d/exclude.txt harry@10.14.2.102:/data/ --delete" RSYNC_CMD2="rsync -avz /data/ --exclude-from=/etc/rc.d/init.d/exclude.txt harry@10.14.2.103:/data/ --delete" $INOTIFY_CMD | while read DIRECTORY EVENT FILE do if [ $(pgrep rsync | wc -l) -le 0 ] ; then $RSYNC_CMD1&&$RSYNC_CMD2 >> rsync.log fi done
2.MYSQL自动备份以及删除备份脚本
代码执行:bash db_backup.sh
db_backup.sh脚本内容如下:
#!/bin/bash # Author: Harry # Description: Database backup script dbback(){ # 定义变量 db_user="ma_prd" db_passwd=" " db_path="/data/bakmysql" db_file="backuprecord" db_date=`date +%Y%m%d_%H:%M:%S` # 判断路径是否存在 [ -d $db_path ] || exit 2 # 使用mysqldump备份数据,并用gzip进行压缩 mysqldump -u$db_user -p$db_passwd --single-transaction ma | gzip > $db_path/${db_date}_ma.sql.gz REVAL=$? if [ $REVAL -eq 0 ] then echo "$db_date ma db is backups successful" >>$db_path/$db_file else echo "$db_date ma db is backups failed" >>$db_path/$db_file fi } #删除超过7天的备份数据 delbak(){ local db_path="/data/bakmysql" find $db_path -type f -name "*ma*.gz" -mtime +7 -exec rm -rf {} \; } dbback delbak
3.使用curl检测网站可用性脚本
代码执行:web_check_with_curl.sh
web_check_with_curl脚本内容如下:
#!/usr/bin/env bash # Author: Harry # Version:1.1 # Description: Web check with curl #定义颜色 red='\e[0;31m' RED='\e[1;31m' green='\e[0;32m' GREEN='\e[1;32m' blue='\e[0;34m' BLUE='\e[1;34m' cyan='\e[0;36m' CYAN='\e[1;36m' NC='\e[0m' date=`date +%Y-%m-%d' '%H:%M:%S` # 定义User Agent ua="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.9 Safari/537.36" pass_count=0 fail_count=0 # 需要检测的url urls=( "http://www.xxx.com" ) function request(){ status=$(curl -sk -o /dev/null --retry 1 --connect-timeout 1 -w '%{http_code}' --user-agent "$ua" $1) if [ $status -eq '200' -o $status -eq '301' \ -o $status -eq '302' ]; then echo -e "[${GREEN} Passed ${NC}] => $1" ((pass_count ++)) else echo -e "[${RED} Failed ${NC}] => $1" ((fail_count ++)) fi } function main(){ echo "Start checking ..." for((i=0;i<${#urls[*]};i++)) do request ${urls[i]}; done # 输出检测通过和失败的记录 echo -e "======================== Summary ======================== " echo -e "Total: ${cyan} $((pass_count + fail_count))${NC} Passed: ${green}${pass_count}${NC} Failed: ${red}${fail_count}${NC} Time: $date" } main $*
4.检测并封禁异常IP地址的脚本
代码执行:bash ban_ip.sh
ban_ip.sh脚本内容如下:
#!/bin/bash # 获取当前日期和时间的格式化字符串 DATE=$(date +%d/%b/%Y:%H:%M) # 日志文件路径和封禁记录文件路径 LOG_FILE="/usr/local/nginx/logs/access.log" BANNED_IP_LOG="/usr/local/nginx/logs/banned_ip.log" # 获取异常IP地址,使用tail命令读取日志文件的最后10000行,并使用grep命令筛选出包含当前日期和时间的日志记录 ABNORMAL_IP=$(tail -n 10000 "$LOG_FILE" | grep "$DATE" | awk '{a[$1]++}END{for(i in a) if(a[i]>10) print i}') # 封禁异常IP地址 declare -a IP_LIST for IP in $ABNORMAL_IP; do if ! iptables -vnL | grep -q "$IP"; then iptables -I INPUT -s "$IP" -j DROP echo "$(date +'%F_%T') $IP" >> "$BANNED_IP_LOG" IP_LIST+=("$IP") fi done # 打印被封禁的IP地址 if [ ${#IP_LIST[@]} -gt 0 ]; then echo "以下IP地址已被封禁:" printf "%s\n" "${IP_LIST[@]}" else echo "没有需要封禁的IP地址。" fi
5.查看网卡实时流量脚本
代码执行:bash interface_moniter.sh eth0
interface_moniter.sh脚本内容如下:
#!/bin/bash # 如果没有传递参数,默认使用 lo 作为网络接口 NIC=${1:-lo} echo -e " In ------ Out" while true; do # 使用awk命令从/proc/net/dev文件中提取指定网络接口的接收字节数和发送字节数,并保存到变量OLD_IN和OLD_OUT中 OLD_IN=$(awk '$0~"'$NIC'"{print $2}' /proc/net/dev) OLD_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev) # 等待1秒钟 sleep 1 # 再次使用awk命令提取最新的接收字节数和发送字节数,并保存到变量NEW_IN和NEW_OUT中。 NEW_IN=$(awk '$0~"'$NIC'"{print $2}' /proc/net/dev) NEW_OUT=$(awk '$0~"'$NIC'"{print $10}' /proc/net/dev) # 计算接收速率和发送速率,单位为KB/s,并保存到变量IN和OUT中 IN=$(printf "%.1f%s" "$((($NEW_IN-$OLD_IN)/1024))" "KB/s") OUT=$(printf "%.1f%s" "$((($NEW_OUT-$OLD_OUT)/1024))" "KB/s") # 使用echo命令输出接收速率和发送速率 echo "$IN $OUT" sleep 1 done
6.访问日志分析脚本代码执行:bash
log_analyze.sh access.log
log_analyze.sh脚本内容如下:
#!/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
原文地址:https://mp.weixin.qq.com/s?__biz=Mzg4NjgyNDU2NQ==&mid=2247489430&idx=1&sn=8ec89298bbdf945af1271facecba7e62
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。