You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

服务器单会话仅支持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

火山引擎 最新活动