如何实现SSH多级跳转直连部署服务器?解决脚本及无sshpass问题
解决方案
1. 让连接保持不退出
脚本执行后立即退出的核心原因是SSH命令未强制分配伪终端,导致交互式会话无法维持。给每一级SSH命令添加-t参数,强制创建伪终端即可解决:
如果仍想用本地的sshpass(中转服务器无需安装),修改脚本为:
sshpass -p '中转服务器密码' ssh -t 中转用户名@中转服务器IP "sshpass -p '部署服务器密码' ssh -t 部署用户名@部署服务器IP"
-t参数会让SSH启动完整的交互式终端,执行后会停留在部署服务器的命令行,不会自动退出。
2. 无需安装工具,实现免密/交互式输入密码访问
最可靠的方案是SSH密钥转发+配置文件简化连接,完全不依赖第三方工具:
步骤1:本地生成SSH密钥对(无则创建)
在本地终端执行:
ssh-keygen -t ed25519
全程按回车默认设置即可,若需更高安全性可设置密钥密码(每次连接需输入)。
步骤2:将本地公钥传到部署服务器
由于无法直连部署服务器,通过中转服务器转发密钥:
- 本地先连接中转服务器:
ssh 中转用户名@中转服务器IP(手动输入一次中转密码) - 在中转服务器上执行:
ssh-copy-id 部署用户名@部署服务器IP,输入部署服务器密码,本地公钥会自动写入部署服务器的~/.ssh/authorized_keys文件。
步骤3:配置本地SSH配置文件
编辑本地~/.ssh/config文件(无则新建),添加以下内容:
Host jump HostName 中转服务器IP User 中转用户名 Host deploy HostName 部署服务器IP User 部署用户名 ProxyJump jump
若中转服务器SSH版本低于7.3(不支持ProxyJump),替换为ProxyCommand配置:
Host jump HostName 中转服务器IP User 中转用户名 Host deploy HostName 部署服务器IP User 部署用户名 ProxyCommand ssh -W %h:%p jump
最终使用
之后在本地终端直接执行ssh deploy,即可自动通过中转服务器跳转到部署服务器,全程无需输入密码,且连接会保持交互式会话。
若暂时不想用密钥认证,也可直接用带-t的多级SSH命令手动输入密码:
ssh -t 中转用户名@中转服务器IP "ssh -t 部署用户名@部署服务器IP"
执行后会依次提示输入中转、部署服务器的密码,无需额外工具,且连接不会自动退出。
内容的提问来源于stack exchange,提问作者Arbi Saidi
相关产品推荐
相关产品推荐

