在Jenkins2.0管道中我需要远程ssh来定位机器。 我的旧方法是使用"使用ssh"在远程主机上执行shell脚本。我想指定用户名和密码。
我已经读过,groovy方法应该像
[h,binLocations] = imhist(I)
RemoteCredentials:它是带密码的私钥
有没有办法用用户名/密码远程凭证制作ssh? sshagent不支持用户名/密码验证
的Riccardo
答案 0 :(得分:5)
很遗憾,你是对的。
看起来ssh-agent-plugin仅支持通过Jenkins的Credentials Management区域添加的存储用户,密码,公钥证书。 See this unit test验证ssh-agent是否基于公钥正常工作。插件中不存在未经测试的功能以支持用户+密码身份验证。
如果可以,请切换到基于公钥的身份验证。如果由于某种原因你无法切换...你 COULD 在你的Jenkins盒子上安装sshpass,但这通常被认为是不好的做法。
node {
stage 'Does sshpass work?'
sh 'sshpass -p \'password\' ssh user@host "ls; hostname; whois google.com;"'
}
答案 1 :(得分:0)
在Jenkins代理上增强运行ssh任务的游戏,将使您的服务器更安全。当您运行诸如Ansible之类的ssh任务时,Jenkins是一个攻击媒介,因此最好控制发布。
改进/ etc / sshd_config将阻止黑客的大量探查。
PasswordAuthentication否
PubkeyAuthentication是
PermitRootLogin no
从DSA或RSA密钥对移至更安全的ed25519椭圆曲线 密码,对私钥文件具有蛮力保护。
ssh-keygen -t ed25519 -o -a 300 -C Jenkins
由于私钥需要几百回合,每次使用将花费数十秒, 对于构建代理来说,这是完美的,开发人员可能会四处窥探。
我宁愿不将私钥作为凭证存储在Jenkins中,因为Jenkins是可插拔的代码执行引擎,而是仅将密码短语存储为秘密文本凭证(在示例中名为mySecretText)。我有专门的环境代理,每个代理都有〜/ .ssh / id_ed25519密钥文件,爆炸半径有限。密码短语用于启动ssh代理,更具体地说,是在每个会话中加载密钥。
下面的Jenkinsfile允许使用密钥对将标签推入git,但是磁盘上没有明文。选择此实现是因为ssh-agent插件不允许ssh-add。
node {
println("Checkout repository...")
checkout scm
}
pipeline {
agent {
label "linux"
}
options {
disableConcurrentBuilds()
}
stages {
stage('PushTheTag') {
steps {
script {
withCredentials([string(credentialsId: 'mySecretText', variable: 'SSH_PASSPHRASE')]) {
sh "echo 'echo \$SSH_PASSPHRASE' > ~/.ssh/tmp && chmod 700 ~/.ssh/tmp"
sh "eval `ssh-agent -s` && cat ~/.ssh/id_ed25519|DISPLAY=None SSH_ASKPASS=~/.ssh/tmp ssh-add - && git tag ${env.BUILD_NUMBER} && git push --tags; kill -9 \$SSH_AGENT_PID"
}
}
}
}
}
}
答案 2 :(得分:0)
解决方案:您想通过 ssh 连接管道中的某些机器。我想提供一种不同的方法,它更安全(我希望能够在机器本身上管理我的 ssh 凭据)。确保您的 ssh 密钥是在 ~/.ssh/id_rsa
下的基础设施中预先构建的(可以通过 ansible/chef/puppet 进行预配置,或者只是在您的 aws/gcp/azure 云环境中使用一些图像快照)。您的管道应在机器中加载 ssh 私钥凭据并连接到节点(其中包含公钥)。
_node(with private key) ---> testing/staging/production_node(with public key)
什么时候使用它?例如用例 - 您想在另一个节点中运行/停止某个进程,或者在管道中的实例 x 和 y 上部署应用程序
简单示例 - 点对点 ( node -> destination_node
) 将是:
def ip-address=<some-ip-address>
sh """#!/bin/bash
eval "\$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
ssh -o StrictHostKeyChecking=no ${ip-address} << 'EOF'
echo 'im in ...'
"""
复杂示例 - 堡垒使用堡垒云架构 (node -> vpc-endpoint -> destination-node
) 将是:
def vpc-endpoint-gw-ip=<some-ip-address>
def subnet-ip=<some-subnet-address>
sh """#!/bin/bash
eval "\$(ssh-agent -s)"
ssh-add ~/.ssh/id_rsa
ssh -At -o StrictHostKeyChecking=no ${vpc-endpoint-gw-ip} << 'EOF'
ssh -o StrictHostKeyChecking=no ${subnet-ip} << 'EOF2'
echo 'im in ...'
"""