如何将文件从SSH远程主机复制到Jenkins服务器

时间:2014-01-21 13:39:35

标签: file ssh jenkins jenkins-plugins

我们正在使用Jenkins服务器进行日常构建过程,并通过SSH在远程主机上执行一些bash脚本。此脚本在远程主机上生成html日志文件。

我们正在使用Copy to slave插件来复制从机上的文件和Publish over ssh插件,以便在构建过程中管理SSH会话。

现在问题是,我们想要将一些文件(Scripts的日志文件)从远程ssh主机复制到Jenkins Server。 哪个是可能的,也是更好的选择(插件会更好,如果有的话)。

编辑:

sshpass是一个选项,但寻找任何插件或更好的方式来完成这项工作。

3 个答案:

答案 0 :(得分:8)

使用sshpass命令在

中发送文件
  

构建环境 - >使用ssh - >在远程主机上执行Shell脚本   发布构建脚本

示例命令:

sshpass -p "password" scp path/of/file <new_server_ip>:/path/of/file

这将跳过scp命令的密码提示,并将为scp提供密码。

答案 1 :(得分:1)

我认为你可以生成ssh密钥对并将其作为参数传递给slave,例如Config File Provider Plugin

然后使用scp使用此密钥对检索文件以进行身份​​验证过程。

答案 2 :(得分:0)

显然为时已晚,但是如果您已经在使用publish-over-ssh,则要避免复制凭据并拥有共享库,可以使用以下常规方法来获取主机配置:

import jenkins.plugins.publish_over_ssh.*

@NonCPS
def getSSHHost(name) {
  def found = null
  Jenkins.instance.getDescriptorByType(BapSshPublisherPlugin.Descriptor.class).each{
    it.hostConfigurations.each{host ->
      if (host.name == name) {
        found = host
      }
    }
  }

  found
}

如前所述,这要么需要全局共享库(以便您的代码受信任),要么(可能)需要多个管理员的批准,对此感到抱歉。

这将返回一个BapSshHostConfiguration

对于密码连接,您可以执行以下操作:

def sshHost = getSSHHost('Configuration Name')
def host = [host: sshHost.hostname, user: sshHost.username, password: sshHost.password]
sshHost = null
sh("""
  set +x
  sshpass -p "${host.password}" scp -o StrictHostKeyChecking=no ${host.user}@${host.host}:filename.extension .
  set -x
""")

这会将文件复制到本地工作目录。 可能不是有史以来最好的代码,但是我不是一个讨厌的专家。它有效,对我来说足够了。 (set +x是为了避免它回显日志中显示密码的命令)。在执行CPS呼叫之前摆脱掉所有非CPS(sshHost = null)可以省去很多麻烦:)

由于我花了很长时间才弄清楚我想与下一个来的人分享。