无需SSH密钥即可实现自动代码同步,核心是用rsync增量传输、sshpass非交互式传密——适用于测试环境或受限系统,5分钟可落地。

不需要 SSH 密钥也能自动同步代码,关键在于用 rsync 做增量传输、用 sshpass 绕过密码交互——适合测试环境、临时交付或受限系统。下面直接讲清楚怎么落地,不绕弯。
确保基础工具已就位
两台 Ubuntu 服务器都要装好:
-
rsync:几乎所有发行版默认自带,检查命令:
rsync --version;没装就运行sudo apt update && sudo apt install -y rsync -
sshpass:非默认组件,安装命令:
sudo apt install -y sshpass - 确认目标服务器 SSH 服务正常,且允许密码登录(
/etc/ssh/sshd_config中PasswordAuthentication yes)
写一条可执行的 rsync + sshpass 同步命令
核心是让 sshpass 在后台“喂”密码给 ssh,再由 rsync 走 SSH 通道完成同步。推荐用密码文件方式,安全可控:
- 创建密码文件(仅所有者可读):
echo "your_server_password" > ~/.rsync_pass && chmod 600 ~/.rsync_pass - 执行同步(注意路径结尾斜杠含义):
sshpass -f ~/.rsync_pass rsync -avz --delete --progress /path/to/local/project/ user@192.168.1.100:/var/www/html/ - 参数说明:
•-a保留权限、时间戳、软链接等
•--delete删除目标端多余文件(保持两端一致)
•--progress方便调试时观察实时进度
• 源路径末尾有/→ 同步内容而非整个目录
适配特殊场景的实用技巧
真实发布常遇到端口非 22、主机首次连接要确认、或含特殊字符密码等情况:
-
指定非标准 SSH 端口(如 7022):
加--rsh="sshpass -f ~/.rsync_pass ssh -p 7022"替换默认 ssh 调用 -
跳过首次连接的 yes/no 提示:
在--rsh中追加-o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -
密码含 @ # $ 等特殊字符:
不要用-p直接传,必须用-f文件方式,避免 shell 解析错误 -
排除日志、临时文件等不需发布的目录:
加上--exclude='logs/' --exclude='.git/' --exclude='node_modules/'
接入定时或触发式自动化
把上面命令封装为脚本,再交由系统调度:
- 新建脚本
/opt/scripts/deploy.sh,开头加#!/bin/bash,末尾加exit 0 - 赋予执行权限:
chmod +x /opt/scripts/deploy.sh - 加入 crontab 每小时同步一次:
0 * * * * /opt/scripts/deploy.sh >> /var/log/deploy.log 2>&1 - 如需 Git 推送后自动触发,可在 Git hooks(如
post-receive)中调用该脚本
这套方案不依赖密钥,5 分钟就能跑通,适合快速验证、CI/CD 流水线中的临时环节或老旧系统维护。真正上线前建议迁移到 SSH 密钥认证,但现阶段它足够可靠、清晰、易排查。


















