Shell批量脚本运维多台住宅服务器集群

为什么要用Shell批量脚本管理住宅服务器集群

如果你是多个住宅服务器(比如几台老旧PC或树莓派)的管理员,手动一台台登录执行命令会非常低效。Shell批量脚本运维多台住宅服务器集群能让你一次写完脚本,在所有机器上同时跑,省下大量时间。
本文从零开始,教你搭建可复用的批量运维环境,包含免密登录、批量执行、结果收集和常见问题修正,适合刚接触集群管理的朋友直接照做。

准备工作:集群清单与无密码登录

先准备好集群的IP列表以及用户名密码(或密钥)。

1. 整理主机清单

在运维机器(称为管理节点)上新建一个文本文件,例如 hosts.txt,一行写一个IP地址:

192.168.1.10
192.168.1.11
192.168.1.12

2. 配置SSH免密登录

避免每次输入密码。
在管理节点执行:

ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/id_rsa

然后通过脚本批量复制公钥(假设所有机器密码相同):

#!/bin/bash
PASS="your_ssh_password"
while IFS= read -r ip; do
    sshpass -p "$PASS" ssh-copy-id -o StrictHostKeyChecking=no "user@$ip"
done < hosts.txt
注意sshpass 需先安装(Ubuntu: apt install sshpass)。如果习惯密钥方式,也可以手动逐个复制。

核心:编写批量执行脚本

1. 批量执行相同命令

创建一个脚本 batch_exec.sh,内容如下:

#!/bin/bash
HOSTS_FILE="hosts.txt"
CMD="$@"

if [ -z "$CMD" ]; then
    echo "用法: $0 <命令>"
    exit 1
fi

while IFS= read -r ip; do
    echo "========== $ip =========="
    ssh -o ConnectTimeout=5 "user@$ip" "$CMD"
done < "$HOSTS_FILE"

使用示例:

bash batch_exec.sh "uptime && free -h"

2. 批量分发文件

创建 batch_scp.sh

#!/bin/bash
SRC="$1"
DST="$2"

if [ -z "$SRC" ] || [ -z "$DST" ]; then
    echo "用法: $0 <本地文件> <远程路径>"
    exit 1
fi

while IFS= read -r ip; do
    echo "分发到 $ip ..."
    scp -r "$SRC" "user@$ip:$DST"
done < hosts.txt

执行:bash batch_scp.sh /path/to/script.sh /home/user/

3. 批量执行本地脚本并将结果收集到文件

#!/bin/bash
LOGDIR="./batch_logs"
mkdir -p "$LOGDIR"
while IFS= read -r ip; do
    ssh user@"$ip" "bash -s" < my_script.sh > "$LOGDIR/${ip}.log" 2>&1 &
done < hosts.txt
wait
echo "所有任务已完成,日志在 $LOGDIR 目录中"

这样所有机器并行执行,日志按IP命名保存。

避坑指南:常见问题与对策

  • 连接超时或拒绝连接:检查目标机器SSH服务是否开启,防火墙是否放行22端口。可先用 nc -zv IP 22 测试端口连通性。
  • 密钥权限错误:远程主机 ~/.ssh 目录权限应为700,authorized_keys 权限为600。如果无法免密,手动执行 chmod 600 ~/.ssh/authorized_keys
  • 主机名解析失败:如果使用主机名而不是IP,确保 /etc/hosts 或DNS解析正确。建议直接用IP列表。
  • 命令中包含特殊字符:将命令用单引号包裹传递给SSH,或将脚本文件上传执行。
  • 批量并发导致负载:如果机器性能弱,避免同时运行大量IO密集型任务,可加入 sleep 0.5 或使用 xargs -P 2 控制并发数。

效果验证:确认集群状态一致

运行一个收集系统信息的脚本,比如:

bash batch_exec.sh "hostname && cat /etc/os-release | head -2 && df -h /"

检查输出是否返回所有机器的主机名、操作系统版本和磁盘使用情况。
如果某台机器没返回结果,优先检查该机器的网络和SSH服务。

也可以定时执行脚本并比对日志,通过 diff 检查配置是否一致性。

高频问题解答

Q: 我没有 sshpass,也不想安装,怎么批量复制公钥?
A: 可以手动逐个执行 ssh-copy-id,或者使用 expect 脚本自动输入密码。对于零基础用户,推荐先手动复制一次,验证通过后再考虑批量方案。

Q: 脚本中某些命令需要sudo权限怎么办?
A: 可以给远程用户配置 NOPASSWD sudo权限(修改 /etc/sudoers 添加 user ALL=(ALL) NOPASSWD: ALL),然后在命令前加 sudo。或者使用 ssh -t 分配伪终端。

Q: 如何获取每台机器执行的结果?
A: 使用上面提到的日志收集方式,或者将结果写入远程文件再通过 scp 拉回。推荐在脚本中重定向输出。

Q: 我的集群中IP经常变化怎么办?
A: 如果在家用路由器下,可以使用DHCP固定IP分配,或者在 /etc/hosts 里定义固定名称。集群规模不大时可以手动更新 hosts.txt

总结

掌握 Shell批量脚本运维多台住宅服务器集群 后,日常更新、检查、备份都能一键执行。
建议先从两台机器开始测试,确认免密登录和基本脚本正常后,再扩展到全部集群。
遇到异常时,优先回看上面的避坑和高频问题部分。
如果你还想了解如何定时运行这些脚本或集成到监控系统,可以继续查看本站相关文章。

分享到:
上一篇
挖矿进程手动查杀清理服务器后门:服务器被植入挖矿进程?手把手
下一篇
宝塔Docker管理器一键部署AI中转网关
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意