关键在于配置SSH密钥免密登录,再封装run_on函数实现批量执行、错误判断与日志记录,结合本地打包、远程分发和配置验证构成完整部署流程。

Linux Shell 脚本实现远程服务器自动化运维部署,关键在于打通本地控制与远程执行的链路,让脚本能“无感登录、批量操作、可靠反馈”。它不是简单地把命令复制粘贴到远程主机,而是构建一套可重复、可验证、带错误处理的执行流程。
配置SSH密钥免密登录是前提
没有这一步,所有自动化都会卡在密码输入环节。手动输密码无法被脚本捕获,会导致中断或失败。
- 在跳板机或管理节点运行
ssh-keygen -t rsa -b 4096,一路回车用默认路径和空密码生成密钥对 - 用
ssh-copy-id user@192.168.1.100把公钥推送到目标服务器,自动写入~/.ssh/authorized_keys - 测试是否成功:
ssh user@192.168.1.100 'hostname'—— 不提示输入密码且返回主机名即为生效 - 若需批量推送,可配合
for host in web1 db1 app2; do ssh-copy-id user@$host; done
用Shell脚本封装远程命令调用逻辑
直接在命令行写 ssh user@host 'df -h' 只适合临时检查;真正部署时,要把动作抽象成可复用、可参数化的函数。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 定义通用执行函数:
run_on() { local host=$1; shift; ssh "$host" "$@"; } - 批量检查磁盘:
for h in web1 web2; do run_on $h "df -h / | awk '/\// {print \$5}'"; done - 带错误判断:
if ! run_on web1 "systemctl is-active --quiet nginx"; then echo "nginx down on web1"; fi - 避免硬编码:把主机列表存进数组或外部文件,脚本读取后循环,方便后期维护
结合本地操作与远程执行完成完整部署流
一次部署往往包含本地准备(打包、校验)、远程分发(scp/rsync)、远程配置(修改文件、重启服务)三个阶段,脚本要串起整条链路。
- 本地打包:
tar -czf app-release-$(date +%Y%m%d).tar.gz --exclude='*.log' ./src - 远程分发:
scp app-release-*.tar.gz user@web1:/tmp/或更高效用rsync -avz --delete ./src/ user@web1:/opt/app/ - 远程配置:
ssh user@web1 "sed -i 's/listen 80/listen 8080/' /etc/nginx/conf.d/app.conf" - 远程验证:
ssh user@web1 "curl -sf http://localhost:8080/health | grep ok",失败则退出并报错
加入基础健壮性保障避免“跑飞”
生产环境不允许脚本出错后还继续往下走,比如文件没传成功却去重启服务,可能引发故障。
- 开头加
set -euo pipefail:命令失败立即退出、变量未定义报错、管道任一环节失败整个算失败 - 关键步骤后加判断:
scp app.tar.gz user@web1:/tmp/ && ssh user@web1 "tar -xzf /tmp/app.tar.gz -C /opt/app/" - 记录日志:
ssh user@web1 "uptime" >> deploy.log 2>&1,便于回溯执行轨迹 - 必要时加超时:
timeout 30 ssh user@web1 "systemctl restart nginx",防服务卡死阻塞

















