TeamCity 9执行SSH Exec时遇com.jcraft.jsch.JSchException: Auth fail错误求助
解决TeamCity SSH Exec的JSch Auth Fail问题
我之前处理过不少类似的SSH认证失败场景,结合你的情况,咱们一步步排查解决:
1. 先搞清楚谁在发起SSH连接
TeamCity的Agent(如果是本地Agent,就是TeamCity服务运行的系统用户,比如teamcity)才是实际发起SSH请求的主体,不是你登录TeamCity web界面的账号!
- 先在TeamCity服务器上确认服务运行用户:
ps aux | grep teamcity,找到对应的系统用户 - 确保你添加到远程服务器
authorized_keys里的,是这个系统用户的公钥,不是你自己的用户或者root的公钥。
2. 修复远程服务器的权限问题
SSH对.ssh目录和authorized_keys的权限要求特别严格,权限过宽会直接拒绝公钥认证,这是最常见的坑:
- 登录远程服务器,切换到目标用户,执行:
chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys chmod 755 ~ # 主目录不能是777这种开放权限
3. 确保公钥正确添加
手动复制公钥很容易出现格式错误(比如换行、多空格),建议用ssh-copy-id工具自动完成:
- 在TeamCity服务器上,切换到TeamCity运行用户后执行:
ssh-copy-id 你的远程用户名@远程服务器IP
这个命令会自动把当前用户的公钥追加到远程服务器目标用户的authorized_keys里,避免手动复制的失误。
4. 检查远程服务器的SSH配置
确保远程服务器允许公钥认证:
- 编辑
/etc/ssh/sshd_config,确认以下配置项:
PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
- 修改后重启SSH服务:
# 新系统(CentOS7+/Ubuntu16.04+) sudo systemctl restart sshd # 旧系统 sudo service ssh restart
5. 先手动测试SSH连接
先排除TeamCity的干扰,直接在TeamCity服务器上用运行用户手动连接远程服务器:
su - teamcity # 切换到TeamCity运行用户 ssh 你的远程用户名@远程服务器IP
如果手动连接失败,先解决这个基础SSH问题;如果手动能成功,再检查TeamCity的配置:
- 确认SSH Exec步骤里的远程用户名和手动测试的一致
- 确认TeamCity没有指定错误的私钥路径(如果不是默认的
~/.ssh/id_rsa,需要在配置里手动指定)
6. 检查密钥类型兼容性
TeamCity 9用的JSch版本比较老,可能不支持ED25519这类新密钥,建议生成RSA密钥试试:
ssh-keygen -t rsa -b 2048
然后重新用ssh-copy-id上传公钥到远程服务器。
附上你提供的错误堆栈供参考:
com.jcraft.jsch.JSchException: Auth fail at com.jcraft.jsch.Session.connect(Session.java:512) at com.jcraft.jsch.Session.connect(Session.java:183) at jetbrains.buildServer.deployer.agent.ssh.SSHSessionProvider.<init>(SSHSessionProvider.java:86) at jetbrains.buildServer.deployer.agent.ssh.SSHExecRunner.createBuildProcess(SSHExecRunner.java:26) at jetbrains.buildServer.agent.impl.runner.CallRunnerService.doCreateBuildProcess(CallRunnerService.java:71) at jetbrains.buildServer.agent.impl.runner.CallRunnerService.createBuildProcess(CallRunnerService.java:47) at jetbrains.buildServer.agent.impl.buildStages.runnerStages.start.CallRunnerStage.doBuildStage(CallRunnerStage.java:47) at jetbrains.buildServer.agent.impl.buildStages.RunnerStagesExecutor$1.callStage(RunnerStagesExecutor.java:25) at jetbrains.buildServer.agent.impl.buildStages.RunnerStagesExecutor$1.callStage(RunnerStagesExecutor.java:18) at jetbrains.buildServer.agent.impl.buildStages.StagesExecutor.callRunStage(StagesExecutor.java:78) at jetbrains.buildServer.agent.impl.buildStages.StagesExecutor.doStages(StagesExecutor.java:37) at jetbrains.buildServer.agent.impl.buildStages.RunnerStagesExecutor.doStages(RunnerStagesExecutor.java:18) at jetbrains.buildServer.agent.impl.buildStages.startStages.steps.RunnerContextExecutor.callRunnerStages(RunnerContextExecutor.java:43) at jetbrains.buildServer.agent.impl.buildStages.startStages.steps.StepExecutor.processNextStep(StepExecutor.java:25) at jetbrains.buildServer.agent.impl.buildStages.startStages.steps.ForEachBuildRunnerStage.executeRunnerStep(ForEachBuildRunnerStage.java:138) at jetbrains.buildServer.agent.impl.buildStages.startStages.steps.ForEachBuildRunnerStage.runStep(ForEachBuildRunnerStage.java:123) at jetbrains.buildServer.agent.impl.buildStages.startStages.steps.ForEachBuildRunnerStage.executeBuildRunners(ForEachBuildRunnerStage.java:83) at jetbrains.buildServer.agent.impl.buildStages.startStages.steps.ForEachBuildRunnerStage.doBuildStage(ForEachBuildRunnerStage.java:44) at jetbrains.buildServer.agent.impl.buildStages.BuildStagesExecutor$1.callStage(BuildStagesExecutor.java:31) at jetbrains.buildServer.agent.impl.buildStages.BuildStagesExecutor$1.callStage(BuildStagesExecutor.java:24) at jetbrains.buildServer.agent.impl.buildStages.StagesExecutor.callRunStage(StagesExecutor.java:78) at jetbrains.buildServer.agent.impl.buildStages.StagesExecutor.doStages(StagesExecutor.java:37) at jetbrains.buildServer.agent.impl.buildStages.BuildStagesExecutor.doStages(BuildStagesExecutor.java:24) at jetbrains.buildServer.agent.impl.BuildRunActionImpl.doStages(BuildRunActionImpl.java:70) at jetbrains.buildServer.agent.impl.BuildRunActionImpl.runBuild(BuildRunActionImpl.java:50) at jetbrains.buildServer.agent.impl.BuildAgentImpl.doActualBuild(BuildAgentImpl.java:288) at jetbrains.buildServer.agent.impl.BuildAgentImpl.access$100(BuildAgentImpl.java:53) at jetbrains.buildServer.agent.impl.BuildAgentImpl$1.run(BuildAgentImpl.java:252) at java.lang.Thread.run(Thread.java:745) Teamcity is on Linux and remote server where TeamCity is trying for SSH is also on Linux.
内容的提问来源于stack exchange,提问作者sachin thakur
相关产品推荐
相关产品推荐

