无需插件在多租户企业Jenkins中执行SSH遇阻塞问题
我之前在企业多租户Jenkins环境里也碰到过一模一样的问题,这种阻塞大多是SSH交互环节没处理好或者凭据加载有问题,咱们一步步来排查解决:
跳过首次连接的主机指纹确认
SSH第一次连接陌生主机时,会弹出是否确认主机指纹的提示,而Jenkins的构建环境是非交互式的,就会卡在这一步。解决方法是在ssh命令里加上-o StrictHostKeyChecking=no参数,比如:ssh -o StrictHostKeyChecking=no user_name@ip要是在意安全性,也可以预先在Jenkins代理节点的
~/.ssh/known_hosts文件里添加远程主机的指纹,这样后续连接就不会再出现确认提示了。直接指定要执行的命令,避免进入交互式shell
别直接用ssh user_name@ip(这会进入远程shell,Jenkins会一直等待输入导致阻塞),如果只是要在远程主机跑命令,应该直接把命令跟在后面,比如:ssh user_name@ip "cd /opt/app && ./deploy.sh"多条命令可以用分号或者
&&串联,执行完命令SSH会自动断开,不会卡住。确认SSHAgent是否正确加载了你的密钥
在执行ssh命令前,先加两步验证:- 打印SSH_AUTH_SOCK环境变量:
echo $SSH_AUTH_SOCK,如果输出了一个socket路径,说明SSHAgent已经正确初始化。 - 列出当前加载的密钥:
ssh-add -l,看看你为远程主机创建的SSH密钥是否在列表里,要是没出现,说明凭据没正确添加到SSHAgent里,得检查Jenkins构建环境里的SSHAgent配置是否选对了凭据。
- 打印SSH_AUTH_SOCK环境变量:
开启调试日志定位具体卡点
给ssh命令加上-v(或者-vvv获取更详细日志)参数,比如:ssh -vvv user_name@ip执行后会输出详细的连接过程日志,你能清楚看到是卡在密钥验证、网络连接还是其他环节,根据日志就能精准定位问题。
检查Jenkins代理节点的权限配置
确保Jenkins运行的用户(通常是jenkins用户)对~/.ssh目录有正确的权限:目录权限设为700,~/.ssh/known_hosts设为644,权限过松或者过严都可能导致SSH连接失败或阻塞。
内容的提问来源于stack exchange,提问作者Saurav Ojha

