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

核心答案:如何用Shell脚本批量运维多台住宅Linux服务器?

通过SSH免密登录配合Shell循环与并行执行,可以将原来手动登录每台机器执行命令的操作,自动化成一条命令完成。
核心步骤包括:配置主控机与各目标机的SSH密钥认证、编写可复用性脚本(含主机列表、命令执行、日志输出与错误处理)、制定重试机制避免网络或服务波动。
本文针对家庭环境的多设备管理场景,给出可直接运行的脚本模板与常见问题的解决方法。

---

适用场景:什么时候需要批量运维住宅Linux服务器?

如果你家里有多台Linux设备(如树莓派做旁路由、旧笔记本装Ubuntu当文件服务器、刷了Armbian的电视盒子、甚至各个房间的智能网关),并且你需要每天检查系统更新、同步配置、重启服务或拉取日志,那么单台手动操作会非常耗时。
批量运维脚本可以:

  • 一次更新所有机器的软件包
  • 统一修改配置文件(如NTP、防火墙规则)
  • 批量检查磁盘使用率和进程状态
  • 并行备份关键目录

家庭环境与生产机房的区别在于:网络更复杂(可能部分机器通过Wi-Fi连接,偶有掉线)、设备性能参差不齐、供电可能不稳定。
因此脚本需要有更健壮的超时与错误处理。

---

准备工作:SSH免密登录与主机清单

保证主控机(你用来运行脚本的电脑,通常是你日常工作的笔记本或一台固定的服务器)与所有目标机之间可以免密码登录。

第一步:在主控机生成密钥对(如果还没有)

ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -N ""

第二步:将公钥复制到每台目标机

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@192.168.1.101
# 对每一台重复执行,输入一次密码

如果目标机没有ssh-copy-id,可以手动追加:

cat ~/.ssh/id_ed25519.pub | ssh user@目标IP "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"

第三步:创建主机清单文件
在合适位置创建 hosts.txt,每行格式:user@IP:端口(默认端口可省略)

kodi@192.168.1.10:22
pi@192.168.1.11:22
root@192.168.1.12:2222

注意:家庭局域网建议使用静态IP或DHCP保留,否则IP变化后脚本需要同步更新。

---

编写批量运维脚本:循环、并行与错误记录

基础循环版本(串行执行)

#!/bin/bash
# 批量执行命令:update.sh
HOSTS_FILE="hosts.txt"
CMD="sudo apt update && sudo apt upgrade -y"

while IFS='' read -r line; do
    [ -z "$line" ] && continue  # 跳过空行
    echo ">>> 正在处理: $line"
    ssh -o ConnectTimeout=10 -o StrictHostKeyChecking=no "$line" "$CMD"
    if [ $? -eq 0 ]; then
        echo "<<< $line 成功"
    else
        echo "<<< $line 失败" >> error.log
    fi
done < "$HOSTS_FILE"

将上述脚本保存为 batch_update.sh,赋予执行权限:chmod +x batch_update.sh
运行:./batch_update.sh

带并行加速版本(使用xargs)

#!/bin/bash
HOSTS_FILE="hosts.txt"
CMD="uptime; df -h / | tail -1"
cat "$HOSTS_FILE" | xargs -I {} -P 5 -t sh -c '
    ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no "{}" "'
'CMD'" 2>&1 | tee -a parallel_output.log'

-P 5表示同时处理5台机器,适合局域网内带宽充裕的情况。

结果验证:检查 error.logparallel_output.log 查看失败或正常输出。
也可以将结果汇总生成报告。

---

避坑指南:家庭环境批量运维的常见问题

  1. SSH免密失效:目标机系统重装后公钥丢失,脚本会提示输入密码。解决方案:先跑一遍检查性命令,若失败则通过邮件或Telegram通知人工处理。可以添加参数 -o PasswordAuthentication=no 来强制非交互并立即失败记录。
  2. 连接超时:有设备离线或网络抖动,ConnectTimeout 根据家庭网络状况调整(建议5-10秒)。设置全局 -o ServerAliveInterval=10 可减少断连。
  3. 命令差异:不同设备可能用不同包管理器(apt、yum、apk)或不同用户权限。建议用一个统一入口脚本,比如 update.sh,在各目标机上预置该脚本,然后批量执行 ssh host "~/bin/update.sh"
  4. 日志堆积:批量输出到屏幕容易刷屏,建议重定向到日志并加时间戳:
   ssh host "date; 你的命令" >> batch_$(date +%Y%m%d_%H%M).log 2>&1
  1. 安全风险:住宅设备暴露公网时,更应谨慎。批量脚本最好在内网执行,且不要将密码硬编码在脚本中。

---

效果验证与常见问题(FAQ)

如何验证所有机器都执行成功?
检查日志中的错误行,或编写二次校验脚本:对比每台机器执行前后状态(比如检查文件是否存在、进程是否运行)。

报错“Permission denied (publickey)”怎么办?
确认目标机 ~/.ssh/authorized_keys 中是否有主控机公钥,且权限为600。重新执行 ssh-copy-id 或手动追加。

机器数量超过20台,串行太慢怎么办?
使用 xargs -P 并行,但注意 -P 值不要超过家庭带宽和路由器并发连接数的承受能力,通常5-10即可。

我想在脚本里获取每台机器的主机名,怎么做?
在循环中通过命令 ssh host "hostname" 获取,并作为变量记录到日志中。

可以定期自动执行吗?
将本脚本加入crontab,比如每天凌晨3点执行:0 3 * * * /home/user/batch_update.sh >> /var/log/batch_daily.log 2>&1。注意部分目标机可能关机或休眠,需要脚本内判断连接失败后跳过。

---

总结:Shell脚本批量运维住宅Linux服务器并不复杂,核心在于规范的SSH免密配置与健壮的错误处理。
先从小范围(2-3台)起步,优化脚本细节后逐步扩展到全屋设备。
如果你需要管理更多的企业级云服务器,也可以参考同样的思路,只需调整主机清单与安全策略即可。

分享到:
上一篇
Nginx防盗链规则保护跨境产品原图不被盗取
下一篇
iptables防火墙完整安全规则拦截恶意扫描
1
系统公告

机房迁移升级通知

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