SCP命令无法复制文件,提示“主机密钥验证失败”。

9

你好,我刚接触Jenkins pipeline,现在想将文件从一个AWS Jenkins服务器复制到另一个AWS服务器。两个服务器都是Ubuntu系统的。当我在Jenkins服务器命令行中运行scp命令时,它可以将文件从Jenkins服务器复制到目标服务器,但在Jenkins pipeline中,它显示“主机密钥验证失败”。我做错了什么?

管道阶段是:

  stage('Deliver') {
        steps {
            sh 'scp -i /home/ubuntu/connec/new_one.pem **/target/*.jar ubuntu@00.00.000.00:/home/ubuntu'
        }
    }

错误信息为:

 scp -i /home/ubuntu/connec/new_one.pem **/target/*.jar ubuntu@00.000.00.00:/home/ubuntu

 Host key verification failed.

 lost connection

 script returned exit code 1

****问题已解决,我已经发布了我的解决方案作为答案。如果我有错误,请提出建议。谢谢****

2个回答

14

scp -v 是你的好朋友。这是 scp 的详细信息标志。

我怀疑您在测试时使用的用户和 Jenkins 运行的用户是两个不同的用户,因此 Jenkins 用户从未进行过初始密钥交换,而且 Jenkins 是无头的,因此无法键入 yes 以接受主机识别密钥。

如果是这种情况,您可以使用 -o "StrictHostKeyChecking=no" 选项与 scp 一起使用自动接受并允许您通过。

将 -v 标志添加到您的 scp 命令中,我敢打赌我们可以在输出中看到正在发生的事情。

这是 scp 的 man 页面。

https://linux.die.net/man/1/scp

祝好运


嗨,我仍然面临错误,我已更新问题并添加了新的错误信息。 - Pranavadurai
当我使用sudo时,它起作用了。这是正确的做法吗? - Pranavadurai
非常有用,scp -v 非常有帮助和信息丰富。 - Kasir Barati

6
我发现了我所犯的所有错误。由于我很新,对许多事情并不了解。因此,我想提及完成此步骤的所有步骤。如果我做错了什么或者有其他不同的方法,请指出。谢谢。
首先,如Darrell在答案中提到的,我在我的SCP命令中添加了"-o“StrictHostKeyChecking=no"这个选项。该命令如下:
   scp -v -o StrictHostKeyChecking=no -i /home/ubuntu/connec/new_one.pem **/target/*.jar ubuntu@00.00.00.00:/home/ubuntu

然而我遇到了以下错误:

    Load key "/home/ubuntu/connec/new_one.pem": Permission denied

    debug1: No more authentication methods to try.

在谷歌和stackoverflow上搜索后,我发现Jenkins用户的权限出现了问题。当我在终端中提交命令时,我使用的是ubuntu用户,但Jenkins使用的是“jenkins”用户。因此,我做了两个更改,我在我的scp命令中添加了sudo。

    sudo scp -v -o StrictHostKeyChecking=no -i /home/ubuntu/connec/new_one.pem target/*.jar ubuntu@00.00.00.00:/home/ubuntu

然后我面对的问题是,“Jenkins”用户没有运行sudo命令的权限,所以我编辑了“VISUDO”文件名。

 sudo visudo

最后添加了这一行

 jenkins ALL=(ALL) NOPASSWD: ALL

之后,当我运行管道时,它完成并复制了文件... 太好了。

但是我仍然想知道我是否做得正确?是否有其他方法?


1
理想情况下,您应该为jenkins用户创建一个单独的密钥对,并将其添加到目标主机用户的authorized_keys文件中。这样Jenkins就不需要sudo了。如果我要逐步给你说明,它看起来像这样:
  1. sudo su - jenkins -s /bin/bash -c "/usr/bin/ssh-keygen -t rsa -b 4096 -f /var/lib/jenkins/secrets/mykey"
  2. 将/var/lib/jenkins/secrets/mykey.pub中的公钥复制到目标机器的authorized_keys文件中
  3. 更改您的scp命令以删除sudo并引用新的私钥-/var/lib/jenkins/secrets/mykey。
- Darrell Plessas
1
注意 - 我尚未测试这些步骤,可能需要进行一些微调... - Darrell Plessas
所以你允许Jenkins成为“超级用户”只是为了能够访问密钥文件吗??是的,因为为什么要关心安全呢... - Daniele Testa
@DanieleTesta:我同意这不是一个好的解决方案,就像我之前说的,我并不是在说这是正确的方式。那是我当时所做的事情,并且行得通。如果能够纠正我所犯的错误,那对大家来说都会很好。谢谢。 - Pranavadurai
@Pranavadurai,将密钥文件的所有者更改为“jenkins”,以便它获得访问权限,如何?或者至少将“jenkins”用户添加到与文件相同的组中? - Daniele Testa
显示剩余2条评论

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