我设置SSH登录,从Windows Agent连接到Linux,但TeamCity出现以下错误。
[新构建问题] com.jcraft.jsch.JSchException:无效的私钥:[B @ 5543cd
SSH Secure Shell生成的密钥对连接服务器没有问题。
类似的问题是here,但这不是我的程序化问题,而是团队城市内部异常。
请注意,我的问题不是GitHub VCS连接问题。我的Windows TeamCity Agent与CentOS Linux服务器之间存在问题。
完整的堆栈跟踪如下所示。
[步骤6/8] com.jcraft.jsch.JSchException:无效私有密钥:[com @ jcraft.jsch.KeyPair.load(KeyPair.java:702)的B @ 5543cd,位于com.jcraft.jsch.KeyPair。加载(KeyPair.java:542)com.jcraft.jsch.IdentityFile.newInstance(IdentityFile.java:40)com.jcraft.jsch.JSch.addIdentity(JSch.java:389)com.jcraft.jsch.JSch .addIdentity(JSch.java:349)at jetbrains.buildServer.deployer.agent.ssh.SSHSessionProvider.initSessionKeyFile(SSHSessionProvider.java:110)at jetbrains.buildServer.deployer.agent.ssh.SSHSessionProvider。(SSHSessionProvider.java:80) 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.buil上的jetbrains.buildServer.agent.impl.buildStages.runnerStages.start.CallRunnerStage.doBuildStage(CallRunnerStage.java:47) dServer.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.runSte p(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.BuildRunAction.doStages(BuildRunAction.java:70)at jetbrains.buildServer.agent.impl.BuildRunAction.runBuild(BuildRunAction.java) :5 0)at jetbrains.buildServer.agent.impl.BuildAgentImpl.doActualBuild(BuildAgentImpl.java:263)at jetbrains.buildServer.agent.impl.BuildAgentImpl.access $ 100(BuildAgentImpl.java:50)at jetbrains.buildServer.agent.impl。 java.lang.Thread.run中的BuildAgentImpl $ 1.run(BuildAgentImpl.java:236)(Thread.java:744)
答案 0 :(得分:4)
答案 1 :(得分:1)
最有可能的是,您提供的私钥格式不是JSCH期望的格式(即OpenSSH)。
此处提供了类似的问题和答案: JSCH - Invalid private key
答案 2 :(得分:0)
在花费大量时间并运行正确的命令并得到相同的无效私钥错误之后,我查找了JSch在寻找什么?最终,我找到了这段代码,该代码可以帮助我创建所需的密钥,并且可以连接:
try {
com.jcraft.jsch.KeyPair pair = com.jcraft.jsch.KeyPair.genKeyPair(new
JSch(), com.jcraft.jsch.KeyPair.RSA);
ByteArrayOutputStream publicKeyOut = new ByteArrayOutputStream();
ByteArrayOutputStream privateKeyOut = new ByteArrayOutputStream();
pair.writePublicKey(publicKeyOut, "kamranbhatti");
pair.writePrivateKey(privateKeyOut);
String publicKey = new String(publicKeyOut.toByteArray());
String privateKey = new String(privateKeyOut.toByteArray());
System.out.println(publicKey);
System.out.println(privateKey);
} catch (Exception e) {
}
我将私钥复制到服务器,并且能够连接。