我们正在使用Jenkins服务器进行日常构建过程,并通过SSH在远程主机上执行一些bash脚本。此脚本在远程主机上生成html日志文件。
我们正在使用Copy to slave插件来复制从机上的文件和Publish over ssh插件,以便在构建过程中管理SSH会话。
现在问题是,我们想要将一些文件(Scripts的日志文件)从远程ssh主机复制到Jenkins Server。 哪个是可能的,也是更好的选择(插件会更好,如果有的话)。
编辑:
sshpass是一个选项,但寻找任何插件或更好的方式来完成这项工作。
答案 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
)可以省去很多麻烦:)
由于我花了很长时间才弄清楚我想与下一个来的人分享。