在内网环境中,服务器通常不会直接暴露在公网上,有的环境需要通过多层跳板机才能到达目标机器。比如从本地 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 密钥认证。