直接用Shell脚本+SSH批量检测全网段服务器Swap状态:先fping或nmap扫描存活主机并存入online_hosts.txt;再并发SSH执行free命令提取ON/OFF、总大小、已用、使用率;最后格式化输出带颜色提示的简明报告。

直接用 Shell 脚本 + SSH 批量检测全网段服务器的 Swap 开启状态和配置比例,无需复杂平台,核心是:扫描存活主机 → 并行 SSH 执行检查命令 → 统一格式输出结果。
1. 快速发现在线服务器
先用 nmap 或 fping 扫描指定网段(如 192.168.1.0/24),只保留响应主机,避免无效连接:
- 推荐用
fping -aq -g 192.168.1.0/24 2>/dev/null | sort,轻量、快、静默输出 IP 列表 - 若防火墙严格,可改用
nmap -sn -n -T4 192.168.1.0/24 | grep "Nmap scan report" | awk '{print $5}' - 结果保存为
online_hosts.txt,每行一个 IP,供后续脚本读取
2. 单机 Swap 状态检测逻辑
在目标服务器上执行一条简洁命令,一次性获取「是否启用」+「实际使用率」+「配置比例」:
swapon --show=NAME,TYPE,SIZE,USED,PRIORITY --noheadings 2>/dev/null | awk '{if(NF>0) print "ON",$3,$4,$5; else print "OFF,0,0,0"}' | head -1- 更稳妥写法(兼容老系统):
free -h | awk '/Swap:/ {if($2=="0") print "OFF,0,0,0"; else printf "ON,%s,%s,%s\n", $2,$3,$4}' - 关键字段含义:ON/OFF 表示是否启用;第二列是总大小(如 2G);第三列是已用(如 1.2G);第四列是使用率百分比(计算得来,非 free 原生字段,需
awk 'BEGIN{OFMT="%.1f"} {if($2>0) print ($3/$2)*100}')
3. 并行批量检测脚本(无需 Ansible)
用 GNU parallel 或纯 Bash + background job 控制并发(建议 10–20 线程),避免卡死或触发风控:
- 基础结构:
while read ip; do echo "$ip: $(ssh -o ConnectTimeout=3 -o BatchMode=yes $ip 'free -h | awk ...')"; done - 加 parallel 更稳:
cat online_hosts.txt | parallel -j15 'echo {}:`ssh -o ConnectTimeout=3 -o BatchMode=yes {} "free -h | awk \"/Swap:/ {if(\$2==\"0\") print \"OFF\"; else print \"ON\",\$2,\$3,(\$3/\$2)*100};"`' - 注意:提前分发免密 SSH key(
ssh-copy-id),否则必须交互输密——自动化就断了
4. 输出结果可读化与异常标记
原始输出是文本流,建议转成带颜色/表格/告警的 CSV 或 Markdown:
- 用
awk过滤高风险项:Swap 未开启(OFF)、使用率 >80%、Swap 大小为 0 或异常(如 4K) - 生成简明报告:
awk -F':| ' '{printf "%-15s %-4s %-6s %-6s %-6s\n", $1, $2, $3, $4, $5}' swap_raw.log | column -t - 加颜色提示(终端查看):
awk '{if($2=="OFF") print "\033[31m"$0"\033[0m"; else if($5>80) print "\033[33m"$0"\033[0m"; else print $0}'
不复杂但容易忽略:确保所有目标机 /proc/swaps 可读、free 命令存在、SSH 配置允许非交互执行。跑前先挑两三台手动验证命令逻辑,再全量跑。

















