如何在本地Jenkins中配置带SSH跳转堡垒机的连接?
刚好踩过这个坑,给你整理几个可行的方案,适配不同的Jenkins使用场景,都能实现通过堡垒机连接目标服务器:
先确认前置条件
首先得明确Jenkins的运行用户:打开Jenkins后台,进入「Manage Jenkins」→「System Information」,找到user.name字段,确认是不是你当前的本地用户(myname)。如果是的话,你现有的SSH配置文件和密钥已经可以复用,只需要调整权限确保Jenkins能读取;如果是其他用户(比如默认的jenkins用户),需要把配置和密钥复制到该用户的~/.ssh目录下再做后续操作。
然后调整文件权限(SSH对权限要求极严,权限过宽会直接拒绝使用密钥):
chmod 700 ~/.ssh chmod 600 ~/.ssh/jumpkey.pem ~/.ssh/serverkey.pem chmod 644 ~/.ssh/config
方案1:用「Publish Over SSH」插件可视化配置
如果你习惯用Jenkins的可视化插件做部署/命令执行,这个方案最直观:
- 进入「Manage Jenkins」→「Configure System」,找到「Publish over SSH」板块
- 先添加**堡垒机(jump)**的服务器配置:
- 填写
Name(比如jump-host)、Hostname(jumpdns)、Username(user1) - 点击「Advanced」,勾选「Use key authentication」,可以直接粘贴
jumpkey.pem的内容,或者选择「From a file on Jenkins master」指向/Users/myname/.ssh/jumpkey.pem - 点击「Test Configuration」确认能连上堡垒机
- 填写
- 再添加**目标服务器(server)**的配置:
- 填写
Name(比如target-server)、Hostname(serverdns)、Username(user2) - 同样在「Advanced」里配置
serverkey.pem的密钥 - 关键操作:在「Advanced」里找到「Proxy」选项,选择「Jump host」,然后选中刚才配置的堡垒机
- 测试连接,成功后就可以在任务里用这个配置执行命令或传输文件了
- 填写
方案2:用Jenkins Pipeline脚本实现(灵活度最高)
如果用Pipeline做自动化流程,推荐结合sshagent插件来管理密钥:
先把密钥存入Jenkins凭据:
- 进入「Manage Jenkins」→「Manage Credentials」→「Global credentials (unrestricted)」→「Add Credentials」
- 选择「SSH Username with private key」,分别添加:
- 堡垒机密钥:
Username填user1,粘贴jumpkey.pem内容,设置ID为jump-key - 目标服务器密钥:
Username填user2,粘贴serverkey.pem内容,设置ID为server-key
- 堡垒机密钥:
然后写Pipeline脚本,两种方式可选:
方式A:复用本地SSH配置
直接用你现有的
~/.ssh/config,和命令行逻辑完全一致:pipeline { agent any stages { stage('Connect to target server') { steps { sshagent(['jump-key', 'server-key']) { // 加StrictHostKeyChecking=no是避免首次连接需要手动确认主机密钥,生产环境建议提前把主机密钥加入known_hosts sh 'ssh -o StrictHostKeyChecking=no server "echo Connected successfully"' } } } } }方式B:直接在脚本里指定ProxyJump
不依赖本地配置,更适合跨环境复用:
pipeline { agent any stages { stage('Connect to target server') { steps { sshagent(['jump-key', 'server-key']) { sh ''' ssh -o StrictHostKeyChecking=no \ -o ProxyJump="user1@jumpdns:22" \ user2@serverdns "echo Connected successfully" ''' } } } } }
方案3:直接复用本地SSH配置(最简单)
如果Jenkins确实用你的当前用户运行,那只要确保权限正确,直接在Jenkins的任何SSH操作里用server作为主机名就行,和你命令行执行ssh server的逻辑完全一致。比如在自由风格任务里添加「Execute shell」步骤,直接写ssh server "your-command"即可。
内容的提问来源于stack exchange,提问作者GuSuku




