SSH 多级跳板机连接与文件传输
在内网环境中,服务器通常不会直接暴露在公网上,有的环境需要通过多层跳板机才能到达目标机器。比如从本地 A 出发,经过 B、C 两个跳板,最终到达目标 D:
A (本地) → B (跳板1) → C (跳板2) → D (目标)
SSH 原生支持 -J(Jump)参数来处理这种多级跳转场景,无需手动逐层 SSH 嵌套,一条命令直达目标。
ssh 连接
在 A 上执行,中间的多个跳板节点用逗号分隔,非默认端口通过 :端口 指定,-p 指定的是最终目标 D 的端口:
ssh -J user_b@B:222,user_c@C:22 -p 22 ubuntu@D
参数说明:
| 参数 | 说明 |
|---|---|
-J | 指定跳板机列表,多个跳板用逗号分隔 |
:222 | 跳板机 B 的 SSH 端口(非 22 时需显式指定) |
-p 22 | 最终目标 D 的 SSH 端口 |
文件传输
scp 传文件
scp 同样支持 -J 参数,端口用大写 -P 指定(注意 scp 的端口参数是 -P 不是 -p):
上传文件到目标:
scp -r -P 222 -J user_b@B:222,user_c@C:22 local_file user_d@D:/path/
从目标下载文件:
scp -r -P 222 -J user_b@B:222,user_c@C:22 user_d@D:/path/ local_file
参数说明:
| 参数 | 说明 |
|---|---|
-r | 递归传输(传目录时必须) |
-P 222 | 最终目标 D 的 SSH 端口(scp 用大写 P) |
-J | 跳板机列表,格式与 ssh 相同 |
rsync 传文件
rsync 通过 -e 参数指定 SSH 命令及其跳板参数:
rsync -avhP -e "ssh -p 22 -J user_b@B:222,user_c@C:22" ./local_dir/ user_d@D:/path/
参数说明:
| 参数 | 说明 |
|---|---|
-a | 归档模式,保留权限、时间戳等 |
-v | 详细输出 |
-h | 人类可读格式 |
-P | 显示进度 + 支持断点续传 |
-e "ssh ..." | 指定底层 SSH 命令,在其中写入跳板参数 |
进阶用法
自动输入密码 + 多级跳板 + 提权
结合 sshpass 实现全自动化(跳板机密码自动填充),并通过 sudo su - 提权:
sshpass -p xxx ssh -tt -o StrictHostKeyChecking=no -J ubuntu@10.1.1.1 ubuntu@10.1.2.1 sudo su -
参数说明:
| 参数 | 说明 |
|---|---|
sshpass -p | 自动提供 SSH 密码,免交互 |
-tt | 强制分配伪终端(sudo 需要终端) |
-o StrictHostKeyChecking=no | 不检查主机密钥(首次连接新机器时避免交互确认) |
sudo su - | 在最终目标机器上提权到 root |
安全提醒:
sshpass在命令行中明文传递密码,会出现在进程列表和 shell 历史中。仅建议在内网可信环境中临时使用,生产环境应配置 SSH 密钥认证。