
1. 场景说明:本指南假设本地(Local)无法直接访问目标服务器(Target),需通过跳板机(Bastion/Jump)中转。准备:本地有ssh客户端(OpenSSH),已配置好可用于跳板机与目标机的用户凭证(密码或公私钥)。
2. 步骤:a) 先能直接 ssh 登录跳板机:ssh user@bastion。b) 从跳板机能 ssh 登录目标机:ssh user@target(可在跳板上测试)。若任一环节失败,检查防火墙、用户、密钥权限(~/.ssh 权限为700/600)。
3. 步骤:a) 单文件本地->目标:scp -J bastion_user@bastion localfile target_user@target:/path/。b) 多文件或目录:scp -r -J bastion_user@bastion localdir/ target_user@target:/path/。注意OpenSSH 7.3+支持 -J。
4. 步骤:a) 命令格式:scp -o 'ProxyCommand ssh -W %h:%p bastion_user@bastion' localfile target_user@target:/path/。b) 若要从远端下载到本地,把目标与本地互换即可:scp -o ... target_user@target:/path/file ./。
5. 示例配置:在本地编辑~/.ssh/config,写入:<pre>Host bastion HostName bastion.example.com User bastion_user IdentityFile ~/.ssh/id_rsa Host target HostName target.internal User target_user ProxyJump bastion</pre>。保存后直接使用 scp localfile target:/path/。
6. rsync 命令:rsync -avz -e 'ssh -J bastion_user@bastion' localdir/ target_user@target:/path/。说明:-a 保持属性,-v 冗余,-z 压缩,-e 指定ssh并通过 -J 使用跳板。若旧版ssh可用 ProxyCommand:-e "ssh -o 'ProxyCommand=ssh -W %h:%p bastion_user@bastion'".
7. 方法:可以在本地使用 scp -3(通过本地做中转),或在本地通过 rsync pull/push:rsync -avz -e 'ssh -J bastion@bastion' src_user@src:/path/ target_user@target:/path/。复杂场景可在跳板机上执行可信脚本。
8. 命令示例:在本地打包并通过ssh解压到目标:tar czf - localdir | ssh -J bastion_user@bastion target_user@target 'tar xzf - -C /dest/path'。常用于大量小文件以减少握手开销。
9. 排错要点:a) 若提示权限拒绝,检查私钥权限与公钥是否在目标 ~/.ssh/authorized_keys。b) 若跳板登录无问题但转发失败,测试 ProxyCommand 的 ssh -W 是否可用。c) 如遇主机密钥变更,处理 known_hosts 中旧记录或用 ssh-keyscan 添加。
10. 对比结论:a) 简单单文件快速用 scp(语法直观)。b) 需要增量、保留属性或大规模同步用 rsync(节省带宽、支持断点续传)。c) 在跳板场景,两者都可通过 -J 或 SSH config 无感使用,优先配置 ~/.ssh/config 简化命令。
11. 问:我的OpenSSH版本不支持 -J,该怎么办?
11. 答:可用 -o ProxyCommand 'ssh -W %h:%p bastion_user@bastion' 来替代,或在~/.ssh/config 为目标配置 ProxyCommand 字段;若两端都受限,可在跳板上启用 netcat/nc 并调整 ProxyCommand。
12. 问:使用 rsync 速度很慢或断开,如何优化?
12. 答:可启用压缩参数 -z,增加 -e 'ssh -C -o CompressionLevel=9';对于大量小文件先打包(tar),提升 TCP 窗口或在 rsync 加上 --whole-file(跳过增量计算)也有帮助。
13. 问:如何保证传输安全且不暴露跳板凭证?
13. 答:建议使用公私钥认证并禁用密码登录,限制跳板的端口与用户权限,开启SSH Agent转发仅在必要场景并谨慎使用;在~/.ssh/config 中使用IdentityFile限定密钥,并在跳板上最小化长期存放私钥的需求。