【问题标题】:How to copy file from SSH remote host to Jenkins Server如何将文件从 SSH 远程主机复制到 Jenkins 服务器
【发布时间】:2014-01-21 13:39:35
【问题描述】:

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

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

现在的问题是,我们想将一些文件(脚本的日志文件)从远程 ssh 主机复制到 Jenkins 服务器。 这将是可能的和更好的选择(如果有插件会更好)。

编辑:

sshpass 是一种选择,但正在寻找任何插件或更好的方法来完成这项工作。

【问题讨论】:

  • 您是否考虑过使用Archive Artifacts 步骤?它将保留与 Jenkins 服务器上的构建相关的日志。
  • 文件是执行脚本生成的...不是jenkins日志。 Artifacts 也可用于此文件??
  • 只要它是在 Jenkins 作业运行时创建的并且您可以访问它,它就是一个 Artifact。事实上,这些类型的文件(生成的 html、编译的二进制文件等)正是 Archive Artifacts 的设计目标。
  • 好的,明天早上会尝试实现它..谢谢你的努力..
  • 愿意分享更详细的 sshpass 命令解决方案描述吗?

标签: file ssh jenkins jenkins-plugins


【解决方案1】:

使用sshpass命令发送文件

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

示例命令:

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

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

【讨论】:

  • 为此,是否需要安装sshpass?因为目前这对我不起作用。
  • 是的,你需要。这是另一个SO answer,它可以为您提供同样的帮助。
  • 使用密钥,而不是存储在 Jenkins 配置中的普通密码。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    显然为时已晚,但如果您已经在使用publish-over-ssh,想要避免重复凭据并拥有一个共享库,您可以使用这个 groovy 来获取主机配置:

    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) 可为您省去很多麻烦:)

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

    【讨论】:

      猜你喜欢
      • 2023-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-16
      • 2015-03-19
      • 2023-01-19
      • 2017-05-02
      相关资源
      最近更新 更多