Jenkins不会使用SSH密钥。

4

很抱歉不得不提出这个问题,但我感觉在SO上已经尝试了每一个答案,但都没有成功。

我的本地机器和远程服务器。 Jenkins正在我的服务器上运行。

如果我打开终端并执行类似于scp /path/to/file user@server:/path/to/wherever的操作,则我的ssh可以正常工作而无需密码

如果我在Jenkins工作中运行此命令,则会显示“主机密钥验证失败

所以我知道我的SSH按照我想要的方式正确工作,但为什么我不能让Jenkins使用这个SSH密钥呢?

有趣的是,当我第一次设置Jenkins和密钥时,它确实可以正常工作,然后我认为我重新启动了本地计算机或重新启动了Jenkins,然后它就停止工作了。很难说确切的原因。

我还尝试了几个关于ssh-agent和ssh-add的选项,但这些选项似乎不起作用。

我验证了本地机器的.pub文件位于/user/.ssh文件夹中,并且也在授权密钥文件中。该文件夹由用户拥有。

非常感谢任何想法,我可以提供有关我的问题的更多信息。谢谢!

更新:

根据Kensters的建议,我执行了su-jenkins,然后执行了ssh server,它要求我添加到已知主机。所以我认为这是朝着正确方向迈出的一步。但之后仍然存在同样的问题。

我之前没有注意到的是,当使用myUsername帐户时,可以无需密码连接ssh server。但是,如果我切换到jenkins用户,则在执行ssh server时会要求我输入密码。

我还尝试了建议的ssh-keygen -R server,但无济于事。

3个回答

7

尝试

su jenkins
ssh-keyscan YOUR-HOSTNAME >> ~/.ssh/known_hosts

SSH Slaves插件不支持ECDSA。上面的命令应该为ssh-slave添加RSA密钥。


对于我来说,不存在 Jenkins 用户,但第二行代码起作用了。我正在使用存储在 gitlab 中的 Terraform 模块,并且在运行 terraform init 之前,我必须执行 ssh-keyscan gitlab.com >> ~/.ssh/known_hosts 命令。只要我使用该命令设置了 known_hosts 文件,Terraform init 就能够成功执行。 - jhnclvr

4
Host Key Verification Failed

ssh提示关于远程主机密钥的问题,而不是您尝试用于身份验证的本地密钥。

每个SSH服务器都有一个“主机密钥”,用于将服务器标识给客户端。这有助于防止客户端连接到冒充预期服务器的服务器。第一次使用ssh连接到特定主机时,ssh通常会提示您接受远程主机的主机密钥,然后在本地存储密钥,以便ssh将来可以识别该密钥。广泛使用的OpenSSH ssh程序将已知主机密钥存储在每个用户的主目录中的文件.ssh/known_hosts中。

在这种情况下,可能发生以下两种情况之一:

  1. Jenkins用于运行这些作业的用户ID以前从未连接到此特定的远程主机,并且其known_hosts文件中没有远程主机的主机密钥。
  2. 由于某种原因,远程主机密钥已更改,并且不再与Jenkins用户的known_hosts文件中存储的密钥匹配。

您需要更新Jenkins用于运行这些ssh操作的用户的known_hosts文件。您需要从文件中删除此主机的任何旧主机密钥,然后将主机的新主机密钥添加到文件中。最简单的方法是使用su或sudo成为Jenkins用户,然后交互式运行ssh连接到远程服务器:

$ ssh server

如果ssh提示你接受主机密钥,请选择是,然后就完成了。你甚至不必完成登录。如果它打印出一个巨大而可怕的警告说主机密钥已更改,运行以下命令从known_hosts中删除现有主机:

$ ssh-keygen -R server

然后重新运行ssh命令。

非常感谢您的建议。然而,我仍然卡住了,我已经根据您的反馈更新了我的问题并列出了我的步骤。 - Frankie

1

需要注意的一点是:当您生成一个将与Jenkins一起使用的密钥时,您无法使用口令短语,因为它不会给您输入这样的内容的机会(因为它在没有人类干预的情况下运行自动化作业)。


SSH代理插件允许输入密码。 - sigi
我没有看到这个,但是我正在使用Blue Ocean。也许他们还没有实现这个功能。 - Tim Keating

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接