Jenkins Pipeline中如何使用用户传入参数建立SSH连接
Jenkins流水线使用构建入参作为SSH连接凭证实现方案
你配置的构建入参界面如下:
两种可直接落地的实现方式:
方案1:动态创建临时凭证,兼容SSH Agent插件
该方案不需要提前在Jenkins凭证库预存固定凭证,临时凭证仅对当前构建生效,构建结束后自动删除,完全适配SSH Agent插件的使用逻辑。
- 提前确认构建参数配置:保留已经设置的用户名(字符串类型)、密码(密码类型)参数,新增目标服务器IP参数即可,参数名可自定义,示例中使用
SSH_USER、SSH_PWD、SSH_HOST作为参数名。 - 流水线代码参考:
pipeline { agent any parameters { string(name: 'SSH_USER', description: 'SSH连接用户名') password(name: 'SSH_PWD', description: 'SSH连接密码') string(name: 'SSH_HOST', description: '目标Linux服务器IP') } stages { stage('远程执行服务器操作') { steps { script { // 生成当前构建专属的临时SSH凭证 def tempSshCred = credentials( type: 'usernamePassword', username: params.SSH_USER, password: params.SSH_PWD, id: "temp-ssh-${BUILD_NUMBER}", description: '构建临时凭证,执行后自动销毁' ) // 加载临时凭证到SSH Agent sshagent(credentials: [tempSshCred.id]) { sh """ ssh -o StrictHostKeyChecking=no ${params.SSH_USER}@${params.SSH_HOST} "uptime" // 后续可追加任意需要执行的远程命令,scp传文件也可直接使用 """ } } } post { always { script { // 无论构建成功失败,都删除临时凭证避免残留 if (tempSshCred?.exists()) { tempSshCred.delete() } } } } } } }
方案2:直接通过参数传递凭证,无需依赖SSH Agent插件
该方案不需要操作Jenkins凭证体系,直接通过sshpass实现非交互SSH认证,配置更简单。
- 前置依赖:在Jenkins任务运行的agent节点上提前安装
sshpass工具:- Debian/Ubuntu系:
apt update && apt install -y sshpass - CentOS/RHEL系:
yum install -y sshpass
- Debian/Ubuntu系:
- 流水线代码参考:
pipeline { agent any parameters { string(name: 'SSH_USER', description: 'SSH连接用户名') password(name: 'SSH_PWD', description: 'SSH连接密码') string(name: 'SSH_HOST', description: '目标Linux服务器IP') } stages { stage('远程执行服务器操作') { steps { sh """ sshpass -p '${params.SSH_PWD}' ssh -o StrictHostKeyChecking=no ${params.SSH_USER}@${params.SSH_HOST} "uptime" // scp传文件可直接替换ssh为scp,例如 sshpass -p '${params.SSH_PWD}' scp -o StrictHostKeyChecking=no 本地文件路径 ${params.SSH_USER}@${params.SSH_HOST}:远程路径 """ } } } }
注意事项
- 密码参数必须选择Jenkins参数类型中的密码类型,不要使用普通字符串参数存储密码,避免控制台输出、参数展示时出现明文泄露。
- SSH命令中必须携带
-o StrictHostKeyChecking=no参数,跳过首次连接的主机密钥确认交互,避免流水线无响应卡住。 - 若使用密钥而非密码连接,逻辑完全一致,只需要把凭证类型替换为密钥类型,对应传入私钥参数即可。
内容的提问来源于stack exchange,提问作者Gonzalo Tamos
相关产品推荐
相关产品推荐

