Jenkins SSH Agent插件加载带密码短语密钥失败排查求助
Jenkins SSH Agent插件加载带密码短语密钥失败问题
问题描述
Jenkins SSH Agent插件无法加载Credentials插件存储的带密码短语密钥,代理与控制器部署在同一机器上,报错信息如下:
ssh_askpass: exec(/var/lib/jenkins/workspace/testing@tmp/askpass_11086250741160980548.sh): No such file or directory
报错提示加载密码短语的脚本不存在,但该脚本会被插件快速删除,无法验证实际存在性,暂无法定位问题源于SSH Agent插件、Credentials插件还是两者的交互逻辑。
已验证情况
- 主机系统
ssh-agent功能正常:命令行执行ssh-add可成功加载该带密码短语的密钥 - SSH Agent插件部分可用:无密码短语的密钥可通过Credentials插件正常调用
当前环境
- 操作系统:RHEL7
- Jenkins版本:2.359
- SSH Agent插件版本:295.v9ca_a_1c7cc3a_a_
- Credentials插件版本:1143.vb_e8b_b_ceee347
- OpenSSH版本:8.8p1a
测试流水线
pipeline { agent any options { ansiColor('xterm') } stages { stage("setup environment") { steps { deleteDir() } //steps } //stage - setup environment stage("Test the key") { steps { sshagent(['testkey']) { sh "ssh host whoami" } //sshagent } //steps } //stage - Test the key } //stages } //pipeline
流水线输出
[Pipeline] { [Pipeline] sshagent [ssh-agent] Using credentials testkey (Test key with passphrase) [ssh-agent] Looking for ssh-agent implementation... [ssh-agent] Exec ssh-agent (binary ssh-agent on a remote machine) $ ssh-agent SSH_AUTH_SOCK=/tmp/ssh-oKcZZF65GvXc/agent.31647 SSH_AGENT_PID=31650 Running ssh-add (command line suppressed) ssh_askpass: exec(/var/lib/jenkins/workspace/testing@tmp/askpass_11086250741160980548.sh): No such file or directory [Pipeline] // sshagent [Pipeline] } . . (已移除冗余的收尾输出) . ERROR: Failed to run ssh-add Finished: FAILURE
已尝试调整私钥末尾换行符,问题未解决。
排查方案
1. 进一步测试方法
- 手动模拟插件流程:在Jenkins工作目录下手动创建临时askpass脚本,脚本内容为输出密钥密码短语,设置
SSH_ASKPASS环境变量指向该脚本,执行ssh-add加载对应私钥,验证是否因脚本权限或路径导致问题 - 替换私钥测试:生成新的带密码短语的RSA/ED25519密钥,通过Credentials插件添加后测试,排除原私钥格式异常问题
- 流水线内直接执行ssh-add:跳过sshagent步骤,手动启动
ssh-agent并设置环境变量,通过echo '密码短语' | ssh-add -的方式加载密钥,验证插件的密码传递逻辑是否存在问题
2. 更多日志开启方式
- 开启插件详细日志:在Jenkins管理界面的「系统日志」中,将
com.cloudbees.jenkins.plugins.sshagent和com.cloudbees.plugins.credentials的日志级别设置为FINE或FINER,获取插件执行时的详细流程日志 - 流水线内增加调试输出:修改流水线,在sshagent步骤前添加
sh 'echo $WORKSPACE'、sh 'ls -la $WORKSPACE@tmp/'查看临时目录权限和文件情况;添加env命令输出环境变量,确认SSH_ASKPASS等变量是否正确设置 - 保留临时askpass脚本:修改Jenkins代理的启动参数,添加
-Dcom.cloudbees.jenkins.plugins.sshagent.SSHAgentStep.keepAskPassScript=true,让插件保留askpass脚本不删除,执行流水线后查看脚本内容和权限是否正常
3. 组件隔离定位实验
- 降级插件版本:分别将SSH Agent插件降级到上一个稳定版本(如293.v42e0b_0c5c0b_7)、Credentials插件降级到兼容版本,测试是否能解决问题,排查新版本插件的兼容性问题
- 使用独立代理测试:临时创建独立的Jenkins代理(即使同机也使用单独用户运行),将密钥加载到该代理中测试,排除控制器与代理同机导致的权限或环境冲突
- 绕过Credentials插件:在流水线中通过
writeFile将私钥和密码短语写入临时文件,手动执行ssh-add加载,验证是否是Credentials插件传递密码短语时出现异常
内容的提问来源于stack exchange,提问作者jonni83
相关产品推荐
相关产品推荐

