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