279个Shell脚本合集:开箱即用的运维自动化工具箱

发布时间:2026/10/16 19:08:43

279个Shell脚本合集:开箱即用的运维自动化工具箱 简介这是一套面向运维工程师与Linux学习者的Shell脚本合集共收录279个可直接运行的实用脚本覆盖DDoS攻击自动屏蔽、系统告警邮件通知、MySQL单/多循环备份、Nginx日志按天切割与分析等高频运维场景。每个脚本配有功能拆解与关键技术点说明例如用tail、grep、awk分析日志并调用iptables封禁异常IP或用mysqldump按库按表分目录备份便于理解命令逻辑并直接落地使用。资源包为单个PDF文档4.69MB以脚本源码和解析为主适合学习Shell编程或希望提升自动化运维效率的初中级技术人员。已有154人学习下载可当作日常运维速查手册也可作为案例库练习日志处理、防火墙联动、数据库备份等实战能力。1. 279个Shell脚本合集开箱即用的运维工具箱先看它解决了什么深夜两点服务器突然被大量请求打满CPU跑满、SSH都敲不动这时候你最需要的不是复杂的安全产品而是几个能直接跑的脚本。这套279个开箱即用的shell脚本正好覆盖这种场景。它包含Dos攻击防范、MySQL数据库备份、Nginx日志切割与分析、网卡流量监控、系统配置初始化、企业微信告警、FTP/SSH客户端等运维高频需求。多数脚本改改路径就能用不依赖复杂环境非常适合刚接手服务器的运维新手也适合想把日常重复劳动脚本化、沉淀成自己团队的软件/插件工具箱的后端开发。下面按模块拆开讲从封IP的攻防脚本开始一路讲到数据库备份、系统初始化最后聊聊脚本上线时常踩的坑和二次改造思路。2. 安全防护与告警脚本从自动封IP到消息推送到手机的完整链路2.1 DoS攻击防范从Nginx日志里揪出异常IP并自动封禁这个脚本几乎可以原样用在被CC攻击的Nginx服务器上。思路不复杂分析最近的访问日志统计每个IP的请求次数超过阈值就加入iptables黑名单。完整代码长这样#!/bin/bash DATE$(date %d/%b/%Y:%H:%M) LOG_FILE/usr/local/nginx/logs/demo2.access.log 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逐段看核心逻辑。第一行DATE$(date %d/%b/%Y:%H:%M)生成类似07/Jan/2024:14:30的字符串这个格式要和Nginx默认日志里$time_local字段保持一致否则后面的grep什么都匹配不到。LOG_FILE指向你的access.log路径改成自己的站点日志路径就行最好用绝对路径避免crontab环境下相对路径失效。第二行是整个脚本的关键。tail -n5000只读取日志最后5000行避免在大日志上做全量扫描拖慢IOgrep $DATE把当前时间窗口的请求筛出来awk按$1字段日志第一列的客户端IP做计数END块里循环输出请求数大于10的IP。这里的10就是封禁阈值生产环境建议调到50甚至100否则正常用户的轮询请求也可能被误杀。for循环里先做了一次去重判断iptables -vnL | grep -c $IP返回0才执行封禁这个检查非常关键。如果你把这个脚本放进crontab每分钟执行一次没有这层判断的话iptables规则表会不断膨胀最终把服务器的网络性能拖垮。封禁动作本身用的是iptables -I INPUT -s $IP -j DROP-I表示插入到规则链最前面让新规则优先生效DROP比REJECT更省资源它直接丢弃来自该IP的数据包不给攻击者任何响应从攻击方视角看服务器像消失了一样。最后一行把每次封禁的IP和时间追加到/tmp/drop_ip.log方便事后溯源比对攻击来源。这个脚本唯一的短板是统计维度比较粗如果你们公司有大量用户走同一个出口IP10次请求的阈值很容易误伤。我一般会先把阈值提高同时把日志记录改成专用目录和系统其他临时文件分开管理。配crontab每1分钟执行一次异常IP通常撑不过一分钟就会被识别并封掉。2.2 邮件告警配置mailx配合SMTP的授权码翻车经验封禁IP之后需要让管理员知道项目里给的方案是用mailx发邮件配置集中在/etc/mail.rc# yum install mailx # vi /etc/mail.rc set fromxxx163.com smtpsmtp.163.com set smtp-auth-userxxx163.com smtp-auth-password你的授权码 set smtp-authlogin实际发送时的调用方式一般是echo $(date %F_%T) 已封禁异常IP: $IP | mail -s Nginx Attack Alert adminexample.com这里的配置有几个特别容易翻车的点。第一smtp-auth-password填的不是邮箱登录密码而是开启SMTP服务后生成的客户端授权码很多人第一次配的时候填了登录密码结果mailx一直报authentication failed。第二很多云主机默认封掉了25端口telnet smtp.163.com 25不通的时候需要把配置改成smtpsmtps://smtp.163.com:465并开启ssl选项。第三smtp-authlogin这里的值必须是小写login写成大写或者plain会导致部分版本mailx解析失败。排查mailx问题时第一站是/var/log/maillog里面会明确记录认证失败、连接超时之类的信息。如果服务器上同时有多个脚本要发告警建议单独抽一个send_alert.sh公共脚本把收件人列表、邮件标题、正文格式都统一维护其他脚本直接调用它省得每个脚本重复写一套mailx参数。2.3 企业微信告警用Python封装一个消息发送类邮件存在延迟和进垃圾箱的问题所以项目里还提供了一个走企业微信应用消息的Python脚本。它把API交互封装成DLF类用requests调接口发送文本或图片消息核心代码如下import requests import json class DLF: def __init__(self, corpid, corpsecret): self.url https://qyapi.weixin.qq.com/cgi-bin self.corpid corpid self.corpsecret corpsecret self._token self._get_token() def _get_token(self): token_url self.url /gettoken?corpid%scorpsecret%s % (self.corpid, self.corpsecret) try: res requests.get(token_url).json() token res[access_token] return token except Exception as e: return str(e) def send_text(self, agentid, content, touserNone, topartyNone): send_msg_url self.url /message/send?access_token%s % (self._token) send_data { touser: touser, toparty: toparty, msgtype: text, agentid: agentid, text: {content: content} } try: res requests.post(send_msg_url, datajson.dumps(send_data)) except Exception as e: return str(e)这个类的设计亮点在构造方法里。__init__一进去就调_get_token()拿access_token企业微信的access_token有效期是7200秒每次实例化都重新获取从机制上避免了token过期问题。send_text方法的参数里agentid是应用的AgentIdtouser是成员账号企业内部IDtoparty是部门IDtouser和toparty至少传一个如果都为空消息谁都收不到。content就是消息正文支持换行符。和邮件告警搭配使用的典型场景是DoS脚本封了IP后先写一条本地日志再调send_text把“封禁哪个IP、当前时间、封禁前请求数”推送给值班同学。这样一个从封禁到通知的闭环就完整了。建议把DLF类单独存成wechat_alert.py其他脚本import进来直接用比每个脚本都重新实现一遍token逻辑要清爽得多。3. 日志处理与流量监控让Nginx日志和网卡数据替你说话3.1 Nginx访问日志按天切割mv改名加USR1信号Nginx的access.log如果不切割几个月能涨到几个GB那时候grep一行日志都要等好几秒。项目里的切割脚本核心就两步把当天日志改名归档再让Nginx重新打开新日志文件。#!/bin/bash LOG_DIR/usr/local/nginx/logs YESTERDAY_TIME$(date -d yesterday %F) LOG_MONTH_DIR$LOG_DIR/$(date %Y-%m) LOG_FILE_LISTdefault.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 /var/run/nginx.pid)这段脚本的关键设计有两个一是按月份创建子目录文件名带上昨天日期%F格式是YYYY-MM-DD归档结构清晰后续想找某一天的日志直接按目录名定位二是最后的kill -USR1 $(cat /var/run/nginx.pid)这个信号是在通知Nginx重新打开日志文件。如果少了这一行mv之后Nginx的master进程还持有旧文件的文件描述符日志仍然会写进已经改名的那份文件里新生成的日志文件反而一直空着。这个脚本适合挂在crontab里每天凌晨0点5分执行。如果想同时切割error.log只需在LOG_FILE_LIST里加上default.error.log。也有同学把它改造为按文件大小实时切割那种方案一般是靠logrotate或定时检查文件大小再触发mv但思路不变核心永远是“改名USR1信号”。3.2 访问日志分析四件套UV、TOP IP、热门页面、状态码分布日志切割是第一步分析日志才是真正产生价值的部分。项目里这个脚本用awk对Nginx日志做了四个维度的统计代码不长但非常值得逐行拆解#!/bin/bash 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 统计访问最多的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注意它的调用方式是把日志文件路径作为参数传进来./analyse.sh access.log。awk的处理逻辑完全基于Nginx默认日志格式的字段位置$1是客户端IP$7是请求的URL含路径和参数$9是HTTP状态码。第一段先统计IP出现次数END块里用length(a)输出不同IP的总数也就是UV然后打印每个IP及其请求数外面接sort -k2 -nr按第二列数字降序head -10取出前10名。第二段统计页面热度核心是a[$7]$7是URL字段。PV就是不同URL的总数后面加了过滤条件a[v]10才输出过滤掉只有零星几次访问的页面更适合线上直接看热门内容。第三段把$7和$9拼在一起计数比如/api/login 404出现5次以上就输出一眼能看出哪些接口在大量报错。这个脚本配合crontab每小时跑一次把输出重定向到文件相当于免费获得了一个轻量级的访问趋势看板。不过它没有处理静态资源过滤查看页面排行时会有大量.png、.css混进来。我一般会在awk外层加一个grep过滤掉常见静态后缀或者改成只统计.php、.do、.json这类动态请求。3.3 网卡实时流量监控两层/proc/net/dev采样求速率网卡流量监控脚本的原理不复杂关键在于它读取的是Linux内核实时维护的虚拟文件/proc/net/dev。#!/bin/bash NIC$1 echo -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 1 done/proc/net/dev的每一行对应一块网卡字段位置固定第一列是网卡名$2是接收字节数RX bytes$10是发送字节数TX bytes。脚本先采样一次存到OLD_IN/OLD_OUTsleep 1秒后再采样两次的差值除以1024就得到每秒的KB数。awk里的$0~$NIC是正则匹配网卡名比如传入eth0就只处理eth0那一行。这段脚本的细节在于数值比较小的时候会显示0.0KB/s因为差值不到1024字节就被整数除法吞掉了。如果机器带宽比较大可以把1024换成1048576换算成MB/s或者直接用bc保留多位小数。这个脚本适合临时排查网络问题时前台运行长时间监控不推荐毕竟它不做数据落盘和历史趋势真要持续采集还是得靠sar或iftop。3.4 80端口异常请求监测超过500就把系统状态快照存下来再来看一个和DoS攻击防范互补的脚本。它盯着80端口的TCP连接数当最小请求数超过500时把系统活动情况输出到alert.txt否则每600秒重试一次。核心逻辑#!/bin/bash statetrue while $state do SMALL_REQUESTS$(netstat -ant | awk -F[ :] /:22/{count[$4]} END {for(ip in count) print count[ip]} | sort -n | head -20 | head -1) if [ $SMALL_REQUESTS -gt 500 ];then sar -A alert.txt statefalse else sleep 6 continue fi done这段脚本有一个细节很容易看走眼awk -F[ :]是把空格和冒号同时作为分隔符这样$4取到的就是连接的对端IP。统计的对象是目标端口22的连接然后按IP计数head -20取出请求数最小的前20个再head -1取其中最小的那个数如果连最小的都超过500说明整体流量异常偏高。这时执行sar -A把系统资源快照存到alert.txt跑完一轮就退出。否则sleep 600秒重试。这里sar -A是sysstat包提供的系统活动报告包含CPU、内存、IO、网络等全量历史数据。这个脚本的巧妙之处在于它不是等攻击打挂了才去抓现场而是用“最小连接数超过阈值”作为触发条件在系统刚出现异常征兆时就留下快照配合前面DoS脚本的封禁一攻一守就完整了。4. 数据库备份与系统初始化给服务器上双保险4.1 MySQL单循环备份一条命令备份所有业务库项目里给了单循环和多循环两个版本的MySQL备份脚本先看单循环版。它适合中小规模、需要快速全库备份的场景。完整逻辑是查数据库列表、排除系统库、逐个mysqldump导出。#!/bin/bash DATE$(date %F_%H-%M-%S) HOSTlocalhost USERbackup PASS123.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这里的mysql命令行带了-s参数意思是silent模式输出结果不带表格框线方便后面直接用shell处理。egrep -v排除了information_schema、mysql、performance_schema、sys四个系统库只留真正的业务库。mysqldump的-B参数作用是备份时附带CREATE DATABASE语句这样恢复的时候不需要手动建库执行source就能直接导入。循环里如果mysqldump执行失败会打印失败信息但不会中断脚本其他库继续备份。这个设计在批量任务里很重要避免一个库出问题导致整个备份链断掉。备份文件命名格式是库名加时间戳比如user_2024-01-07_14-30-00.sql恢复时能清楚知道这份备份对应哪个时间点。实际环境里这个脚本经常要改两点一是备份目录按周或按月分目录避免几百个sql堆在一起二是mysqldump的密码不要硬编码在脚本里更稳妥的做法是用~/.my.cnf的[client]段统一配置这样ps aux查进程时不会暴漏密码。4.2 MySQL多循环备份分库分表恢复更灵活单循环适合全库快速备份但如果库特别大恢复单表会非常痛苦。多循环版每个表单独导出一份sql目录结构清晰想还原哪张表就还原哪张。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内层循环里先为每个库创建带时间戳的独立目录再遍历该库的所有表每张表单独执行一次mysqldump。注意这里的mysqldump参数是$DB $TABLE两个参数直接指定库名和表名导出的sql里不含CREATE DATABASE语句导入时需要先use进入目标库。多循环的代价是备份文件数量多、总耗时比单循环长而且mysqldump每张表单独跑会反复建立数据库连接对大库而言连接开销不可忽视。我的建议是库数量少、单库数据量大用多循环库数量多但每个库都不大用单循环单位时间内的备份效率更高。另外两个脚本都建议配合find命令定期清理超过N天的备份比如find $BACKUP_DIR -name *.sql -mtime 7 -delete否则磁盘迟早被备份文件写满。4.3 服务器系统配置初始化新机器从时区到内核参数一次搞定新买一台服务器手动改时区、关防火墙、配内核参数少说半小时而且每台手工操作难免有遗漏。项目里的初始化脚本把这一套全部自动化了关键代码段如下# 设置时区并同步时间 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 21;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 # 内核参数优化 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这个脚本有几个值得借鉴的设计。时区部分用ln -s把上海的zoneinfo文件软链到/etc/localtime这是修改系统时区最直接的做法。接着检查crontab里是否已有ntpdate没有就追加一条每天凌晨1点的时间同步任务不会重复添加。防火墙部分用egrep判断系统版本CentOS 7走systemctlCentOS 6走service一套脚本兼容两代系统。内核参数段的写法特别适合批量初始化用cat追加到/etc/sysctl.conf末尾的EOF是heredoc语法把多行配置一次性写入。tcp_syncookies 1开启SYN Cookies防SYN Floodtcp_max_tw_buckets和tcp_fin_timeout调整TIME_WAIT数量与回收间隔tcp_max_syn_backlog增大SYN队列长度这些参数对高并发Web服务器很实用。执行完后记得sysctl -p让配置生效。脚本里还有禁用root远程登录、历史命令显示操作时间、设置TMOUT超时等安全加固项每个都是sed对配置文件的精准替换没有多余的交互步骤。上线新机器时跑一遍这个脚本基础配置基本到位剩下的就是装业务环境了。4.4 批量监控100台服务器磁盘ssh循环加awk解析监控一百台服务器的磁盘利用率是合集里另一个很实用的例子。思路不是装agent而是基于SSH远程执行df命令然后解析返回结果HOST_INFOhost.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) ssh -p $PORT $USER$IP df -h /tmp/disk.tmp USE_RATE_LIST$(awk BEGIN{OFS}/^\/dev/{print $NF,int($5)} /tmp/disk.tmp) 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 done donehost.info的格式是“IP 用户名 端口”按空格分隔#开头的行当作注释。外层awk跳过注释行取出IP列表内层awk用-v传参匹配ip所在行取对应的用户名和端口。ssh到目标机器执行df -h结果存到临时文件再用awk筛出以/dev开头的磁盘行$NF是挂载点$5是使用率百分比数字。解析结果用OFS把挂载点和使用率拼成类似/data85的字符串内层循环再通过${USE_RATE%*}和${USE_RATE#*}做字段拆解。这里用到的就是shell的字符串截取语法%*从右往左删除匹配内容、#*从左往右删除两个配合就是把键值对拆开。判断部分使用率大于等于80就输出告警。这个脚本没有做并发100台机器一台一台ssh过去每台约1到2秒跑完要几分钟但胜在逻辑清晰。想提速的话把外层循环体包进{}后台执行再用wait等待全部完成合集里并发获取hostname的例子正是这么做的。注意用ssh做批量监控时记得提前配置好公钥免密登录否则脚本会在密码输入处卡住crontab环境下尤其坑。5. 避坑与常见问题脚本上线前绕开这五个坑5.1 iptables规则重复添加现象DoS攻击脚本跑了一周iptables -L一看几百条规则正常用户也被封了。原因脚本在crontab里高频执行如果封禁IP后没有把状态同步到判断逻辑规则就会越积越多。另外阈值10次太低正常API轮询几分钟就可能触发误封。解决保留脚本里grep -c $IP的检查判断把封禁阈值从10调到50或100定期用iptables -F清空过期规则或者把封禁动作改成ipset加定时解封。5.2 mailx发不出邮件提示SMTP认证失败现象脚本里配好mailx执行mail命令没报错但邮件一直发不出去日志里提示authentication failed。原因邮箱的SMTP密码必须是客户端授权码不是登录密码。另一个隐蔽问题是云服务器25端口被运营商封禁连接直接超时。解决登录邮箱后台开启SMTP服务并生成授权码填入smtp-auth-password用telnet smtp.163.com 25确认端口通不通不通就把smtp配置改成smtps://并指定465端口。5.3 Nginx日志切割后新日志文件一直是空的现象mv之后新生成的文件没有内容旧文件还在继续变大。原因没有执行kill -USR1或者nginx.pid路径写错导致信号没送到master进程。解决确认/var/run/nginx.pid存在且内容正确可以用ps -ef | grep nginx核对master pid运行kill -USR1后观察新日志文件是否开始增长。5.4 mysqldump备份出0字节文件现象crontab定时执行的备份脚本生成的sql文件全是0字节手动执行却一切正常。原因crontab的PATH环境变量非常精简通常只有 /usr/bin 和 /bin找不到mysqldump的执行路径报错又被2/dev/null吞掉了最后只留下一个空文件。解决脚本开头显式指定PATH/usr/local/mysql/bin:/usr/bin:/bin或者直接用mysql的绝对路径。另外不要裸用2/dev/null改成追加写入备份日志文件保留错误信息方便排查。5.5 企业微信告警没消息代码也不报错现象Python脚本运行完没有任何输出但应用里就是收不到消息。原因access_token获取失败时_get_token返回的是错误字符串而不是tokensend_text拿着错误字符串去调接口异常又被try-except吞掉看起来就像什么都没发生。解决调试阶段把res.text打出来看接口返回的错误码。常见的有40014token无效、60020用户不存在。touser要填成员的内部账号不是微信昵称并确认应用配置了可见范围。6. 二次开发把封IP脚本改造成带配置文件和多策略的通用工具拿到手的脚本大多是写死参数的直接能跑但想真正变成自己的生产力工具第一步是抽配置。以DoS攻击防范脚本为例我会做三个版本的迭代。第一版把日志路径、阈值、被封IP记录文件提取到config文件脚本里循环读取。比如你有三台Nginx各自日志路径不同用for循环逐个读配置再执行核心逻辑不用复制三份脚本。第二版兼容firewalld。CentOS 7及以后默认防火墙是firewalld虽然直接调iptables命令也能用但规则管理和firewalld不互通生产上容易出现“脚本封了IP但firewalld规则里看不到”的尴尬。改造方式是先检测系统里哪个服务在运行动态决定用iptables还是firewall-cmdif systemctl status firewalld /dev/null; then firewall-cmd --permanent --add-rich-rulerule familyipv4 source address$IP drop firewall-cmd --reload else iptables -I INPUT -s $IP -j DROP fi第三版加上封禁到期自动解封。维护一个带时间戳的封禁记录比如/var/log/blocked_ips.log里每行“IP 时间戳”解封脚本遍历记录超过1小时的自动移除规则避免误封的IP永久失联。验证方法上我一般会在本地用ab模拟并发请求ab -n 1000 -c 50 http://127.0.0.1/把阈值临时调成50确认脚本能在几十秒内识别并封禁本机IP解封逻辑也能在设定时间后把规则撤掉。从那以后我每次上线这类脚本都强制走一遍“先手动模拟、再看封禁日志、最后小流量灰度”的流程不再直接怼到生产环境裸跑。希望帮到你。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/10/16 19:08:43

基于MATLAB GUI的音频FIR滤波器设计与实现

写这个项目的时候,我其实已经用纯脚本方式调过不少FIR滤波器,但每次换个参数都要改代码、跑一遍、再画图看结果,效率低得让人烦躁。后来痛下决心把这套流程搬到了MATLAB GUI里,才发现真正好用的不是那个最终的滤波器,而…

2026/10/16 19:03:42

医疗器械设计控制从碎片化到一体化的数字化转型路径

医疗器械行业正处于深刻变革之中。人口老龄化、慢性病管理需求增长、价值导向医疗模式兴起、医疗场景从大型医院向诊所与居家扩展——这些趋势共同推动着医疗器械产品向更复杂、更智能、更互联的方向发展。与此同时,设备复杂性提升、网络安全威胁加剧、AI与机器学习…

2026/10/16 20:18:49

最优方向法MOD:字典学习入门与Python实现

简介:这份资源围绕最优方向法(MOD)展开,面向图像处理、计算机视觉方向的学习者与研究者,尤其适合正在接触字典学习与目标检测的读者。MOD通过迭代选取最具代表性的原子构建字典,使数据以更少基元素近似表达…

2026/10/16 20:18:49

基于立体视觉SLAM的在线目标检测与定位:从原理到工程实践

1. 从标题拆解:这个方向到底在解决什么问题“基于立体视觉SLAM系统的在线目标检测与定位”这个标题,第一次看到的时候我就觉得它踩中了两个非常实在的痛点。一个是SLAM本身只做定位和建图,不管场景里有什么东西;另一个是目标检测模…

2026/10/16 20:18:49

Jetson Nano C++ GPIO实战:libgpiod库选型、引脚映射与避坑指南

简介:Jetson Nano的GPIO库是一套基于C/C的硬件控制开发包,面向嵌入式开发者与AI边缘计算爱好者,用于通过GPIO接口控制LED、传感器等外围设备,解决Linux系统下引脚访问与编程的入门难题。资源完整包含库源码、头文件、示例、CMake配…

2026/10/16 20:18:49

单片机MD5校验原理与移植避坑:从资源适配到固件升级实践

简介:面向瑞萨、ST及上海东软等常见MCU平台,这套MD5加密源码为单片机开发者提供了可直接移植的哈希算法C实现,适用于数据完整性校验、密码存储与防篡改等嵌入式安全场景。压缩包仅含1个C源文件和1个头文件,整体约3KB,结…

2026/10/16 20:18:49

Delphi转C# 4.0迁移实战:类型映射、工具选型与避坑指南

简介:Delphi2CS 4.0 是一款将 Delphi 代码转换为 C# 代码的实用工具,主要面向需要做旧项目迁移、跨语言重构的开发者,尤其适合手上积累了大量 Delphi 源码、希望低成本转向 .NET 技术栈的中高级程序员。该版本在原有基础上做了关键调整&#…

2026/10/16 20:13:49

无监督特征学习:实例判别与对比学习原理实战

1. 这篇论文到底在解决什么“老问题”——从监督学习的天花板说起你有没有试过训练一个图像分类模型,却卡在标注数据上?比如想让模型识别某种工业零件的微小划痕,但手头只有几百张没标签的产线截图;又或者想构建一个跨设备的健康监…

2026/10/16 5:33:43

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/16 4:03:48

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/15 13:42:16

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/16 0:01:11

Cephadm实战指南:Linux系统工程师的生产级Ceph集群部署与排障

简介:本资源是一份完整的Ceph分布式存储系统中文技术文档合集,面向Linux系统运维工程师、云平台架构师及存储方向开发者,帮助读者系统掌握Ceph集群的部署、配置与运维核心能力。文档覆盖对象存储(RGW)、块设备&#xf…

2026/10/16 0:01:11

ITK中SpatialObject几何体系解析:坐标系、变换与管道集成

1. 空间对象的定位:为什么 ITK 需要一套几何描述体系很多刚开始接触 ITK 的朋友,包括我自己,最初都是被它的图像滤波、配准、分割这些“正统”功能吸引进来的。等真正上手做点实际项目,比如把分割出来的器官边界做量化分析、给血管…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑