You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:56:03