服务器单会话仅支持10个SSH连接时,如何批量处理100个目标的SSH会话
服务器单会话仅支持10个SSH连接时,如何批量处理100个目标的SSH会话
嗨,这个场景我太熟悉了——服务器有并发连接限制,直接一股脑跑100个SSH会话肯定会被拦下来。不过咱们有两种简单靠谱的方法来控制并发数,保证每次最多跑10个任务,完美适配服务器的限制:
方法一:用xargs快速实现(最简洁)
xargs本身就支持指定并发进程数,比手写循环控制要省心得多。直接把你原来的while循环改成下面的写法就行:
cat ip | xargs -n 1 -P 10 ./connect.sh >> ip.OK
这里的参数解释下:
-n 1:每次给connect.sh传递1个IP地址-P 10:最多同时启动10个connect.sh进程
xargs会自动帮你管理进程池,一批10个跑完就自动启动下一批,完全不用手动操心计数和等待。
方法二:在原while循环基础上改造(更灵活)
如果你更习惯保留原来的while循环结构,那可以加个计数器和等待逻辑,手动控制并发数:
count=0 # 读取IP列表 cat ip | while read -r ip do # 后台执行SSH脚本 ./connect.sh "$ip" >> ip.OK & count=$((count + 1)) # 每启动10个进程就等待所有后台任务完成 if [ "$count" -eq 10 ]; then wait count=0 fi done # 别忘了等待最后一批不足10个的进程完成 wait
这个逻辑很直观:每启动一个进程就给计数器加1,满10个就用wait命令等待所有后台进程跑完,再重置计数器继续处理下一批。最后循环结束后再执行一次wait,确保剩下的几个任务也能跑完。
额外小建议
为了避免某个SSH会话因为网络问题卡住(导致整个批次一直挂着),建议在connect.sh里的SSH命令加上超时参数,比如:
ssh -o ConnectTimeout=10 -o ServerAliveInterval=5 "$1" '你的命令'
这样能有效防止僵死进程拖慢整个批量任务。
备注:内容来源于stack exchange,提问作者Triple Har




