macOS批量管理远程服务器的核心是免密登录、循环执行与可靠机制:先用ssh-keygen生成密钥,ssh-copy-id分发公钥,再通过batch-run.sh脚本传参执行命令,支持超时、日志记录和有限并发。
macos 上用 shell 脚本批量管理多台远程服务器,核心是“免密 + 循环 + 可靠执行”,不是靠图形界面或第三方工具凑数。系统自带的 ssh、scp 和基础 shell 功能完全够用,关键在于配置扎实、脚本健壮、逻辑清晰。
确保 SSH 免密登录可用
这是所有批量操作的前提——macOS 默认装了 OpenSSH 客户端,但必须提前打通信任链:
- 在 Mac 上生成密钥(如未生成过):
ssh-keygen -t rsa -b 4096,一路回车即可 - 准备服务器列表文件
servers.txt,每行格式为:用户名@IP地址[:端口],例如:admin@192.168.1.10root@10.0.20.5:2222 - 用循环分发公钥:
while read host; do ssh-copy-id "$host"; done < servers.txt
遇到提示时输入一次密码,后续就不再需要 - 验证是否生效:
ssh admin@192.168.1.10 uptime,不输密码能返回结果即成功
写一个可复用的批量命令执行脚本
避免每次改命令都重写逻辑,封装成带参数的脚本更省心:
部署和使用军舰的 macOS Automator 自动化服务集合。包含 5 个实用工作流:PDF转JPG、PNG重命名并转JPG、图像拼接、解压RAR、顺序命名图像文件。一键安装所有服务到 ~/Library/Services/ 目录。使用场景:(1) "安装我的自动化服务",(2) "部署所有 Automato...
- 新建文件
batch-run.sh,开头加解释器和错误控制:#!/bin/bash<br>set -e -o pipefail
- 支持传入命令作为参数:
CMD="${1:-'hostname'}"<br>if [ $# -lt 1 ]; then echo "用法: $0 '要执行的命令'"; exit 1; fi - 逐台执行并标记结果:
while read host; do<br> echo "--- $host ---"<br> ssh -o ConnectTimeout=5 "$host" "$CMD" 2>/dev/null || echo "[失败] $host"<br>done < servers.txt
- 赋予执行权限:
chmod +x batch-run.sh,运行:./batch-run.sh "df -h | grep /dev/sda1"
批量上传文件并远程执行
常见需求:推脚本 → 设权限 → 运行。把两步合成一个流程更稳妥:
- 先用
scp传文件(支持通配符):for host in $(cat servers.txt); do scp deploy.sh "$host:/tmp/"; done - 再统一执行:
for host in $(cat servers.txt); do ssh "$host" "chmod +x /tmp/deploy.sh && /tmp/deploy.sh"; done - 进阶写法:用单条
ssh把本地脚本内容直接传过去执行(适合小脚本):cat local-script.sh | while read host; do ssh "$host" 'bash -s' < /dev/stdin; done < servers.txt
提升稳定性和可观测性
生产环境不能只看“有没有输出”,得知道“哪台挂了、为什么挂”:
- 加超时和重试(简单版):
ssh -o ConnectTimeout=3 -o BatchMode=yes "$host" "$CMD" - 记录每台执行日志:
ssh "$host" "$CMD" > "log/$host.log" 2>&1 || echo "$host failed" >> error.log - 并发执行(谨慎使用):用
wait控制并发数,例如同时跑 4 台:count=0; while read host; do ((count++ % 4 == 0)) && wait; ssh "$host" "$CMD" &; done < servers.txt; wait

















