rsync同步非22端口需用-e指定ssh端口,如rsync -avz -e "ssh -p 2222" /local/ user@host:/remote/;或配置~/.ssh/config简化命令;脚本中建议用单引号防Shell解析错误。

当你需要把本地文件同步到云服务器或内网机器,而对方SSH服务监听在2022、2222、60022等非22端口时,直接套用默认rsync命令会连接失败,报错“Connection refused”或“ssh: connect to host x.x.x.x port 22: Connection refused”,因为rsync默认调用ssh时硬编码使用22端口。
核心原理:让rsync走你指定的SSH端口
rsync本身不处理网络连接,它依赖外部shell(默认是ssh)建立安全通道。所以你要做的不是“告诉rsync端口”,而是“告诉rsync:请调用ssh,并让它用-p参数连指定端口”。关键就在-e(或--rsh)这个开关。
这一步不能省略,否则rsync仍会尝试连22端口,哪怕你.ssh/config里写了Port也无效——因为rsync不读那个配置,除非你显式用-e传参。
方法一:用 -e "ssh -p 端口号" 直接指定
第一步:确认远程主机IP、用户名、目标路径和SSH端口(比如2222)。
第二步:执行推送命令(本地→远程):rsync -avz -e "ssh -p 2222" /local/dir/ user@192.168.1.100:/remote/dir/。
第三步:执行拉取命令(远程→本地):rsync -avz -e "ssh -p 2222" user@192.168.1.100:/remote/dir/ /local/dir/。
注意:-e后面的ssh命令必须用双引号包裹,且-p和端口号之间不能有空格;如果端口号写错或服务未监听,会立刻报connection refused。
方法二:通过 SSH 配置文件简化命令
如果你频繁连接同一台非标端口机器,可以免去每次敲-e参数。
编辑~/.ssh/config,加入以下内容:
Host myserver
HostName 192.168.1.100
User user
Port 2222
保存后,直接运行:rsync -avz /local/dir/ myserver:/remote/dir/,rsync会自动查配置并走2222端口。
【重要前提】此方法要求你的OpenSSH版本 ≥ 7.3,旧系统可能忽略Port字段;执行前可用ssh myserver测试是否能连通。
方法三:用单引号避免Shell解析错误(进阶场景)
当端口号变量来自脚本,或路径含空格、特殊字符时,双引号可能被Shell提前展开。
这时改用单引号更稳妥:rsync -avz -e 'ssh -p 2022' "/path with space/" user@host:'/dest path/'。
单引号确保整个字符串原样传给rsync,不会被本地Shell误拆解——尤其在自动化部署脚本中,这是防止同步中断的关键细节。


















