家用住宅主机Linux Shell批量脚本运维多住宅主机
家里有多台Linux小主机(比如树莓派、旧笔记本刷Linux、NAS等)时,每次逐台登录执行命令非常低效。
用Shell脚本批量推送指令,能大幅节省重复操作的时间。
本文从零开始,教你如何搭建一套可复用的批量脚本环境。
准备工作:选一台跳板机并配好免密登录
你需要一台常开的主机作为跳板机(通常是主路由或一台NUC),其他所有要管理的主机都从这个跳板机SSH连接。
- 在跳板机上生成SSH密钥对(如果已有可跳过):
ssh-keygen -t ed25519 -N '' -f ~/.ssh/id_ed25519
按回车默认路径,不设密码。
- 将公钥复制到每一台被管主机:
ssh-copy-id user@host_ip
需要输入一次每个主机的登录密码。
成功后再用 ssh user@host_ip 验证是否直接登录。
- 创建主机列表文件
/home/you/hosts.txt,每行一个IP地址或主机名:
192.168.1.101
192.168.1.102
192.168.1.103
如果端口不同,也可以写成 192.168.1.101:2222,脚本里再拆分。
编写批量执行Shell脚本
核心思路:用 while read 循环读取列表,对每个主机执行你需要的命令。
以下示例检查所有主机的磁盘使用情况:
#!/bin/bash
# 批量检查磁盘使用率
HOSTS_FILE="/home/you/hosts.txt"
USER="your_username"
COMMAND="df -h | grep -v tmpfs"
while IFS= read -r host; do
echo "========== $host =========="
ssh -o ConnectTimeout=5 "$USER@$host" "$COMMAND"
if [ $? -ne 0 ]; then
echo "[ERROR] $host 连接失败或命令执行异常" >&2
fi
done < "$HOSTS_FILE"
将上面内容保存为 batch_check.sh,执行 chmod +x batch_check.sh,然后 ./batch_check.sh 即可看到每台主机的磁盘空间。
关键点: 把 COMMAND 变量替换成你想批量运行的任何命令,例如 uptime、apt update && apt upgrade -y、systemctl restart nginx 等。
如果需要多行命令,最好先写成独立的远程脚本再复制执行。
避坑指南:新手最容易翻车的地方
- SSH密钥权限:私钥文件必须为600权限:
chmod 600 ~/.ssh/id_ed25519,否则SSH会拒绝使用。 - 首次连接指纹确认:如果被管主机之前没有被跳板机连接过,脚本会卡住等待手动确认。解决方法有两个:一是在
~/.ssh/config添加StrictHostKeyChecking no(安全风险低的内网可用),二是先在每台主机手动执行一次SSH连接确认指纹。 - 命令执行结果:不是你期望的返回值:如果某台主机连接超时,脚本会继续跑下一台。给你代码里已经加了退出码判断,但最好在
COMMAND后加|| echo "[FAIL]"更明确。 - 长时间命令:如果批量进行
apt upgrade,建议加上DEBIAN_FRONTEND=noninteractive避免交互弹窗。
效果验证:确认所有主机都执行成功
- 手动检查输出:脚本标准输出应显示正常结果,错误输出(stderr)重定向到屏幕或日志。可以统一追加日志:
./batch_check.sh 2>> error.log
- 如果被管主机数量少,也可以在各主机上检查对应服务状态:
systemctl is-active your_service
- 利用
wc -l统计输出行数,与主机列表行数对比,排查未响应的主机。
拓展思路:让脚本更灵活
- 并发执行:在循环中加入
&后台运行,最后加wait。 - 传递参数:将脚本改造成接受参数,比如要执行的命令通过第一个参数传入。
- 记录日志:按主机名和时间命名日志文件,方便追溯。
如果你管理的主机数量增长到几十台,可以在此基础上套用 pdsh、ansible 等工具。
但Shell脚本始终是最轻量、零依赖的方案,适合家用机房场景。