是否有人发现 sshpass 可以为 ssh 或 git 克隆设置短语?
我有一个带有部署密钥和密码的 GitHub 仓库
这将按预期提示输入密码,并在手动输入后进行克隆
git clone git@github:me/myrepo.git
这会导致挂起
sshpass -p "secret" -v git clone git@github:me/myrepo.git
发生这种情况似乎是因为搜索字符串永远不会与实际字符串匹配,但似乎没有办法改变搜索字符串。
SSHPASS searching for password prompt using match "assword"
SSHPASS read: Enter passphrase for key '/home/jenkins/.ssh/id_rsa':
答案1
这是因为您不能使用 sshpass 来提供密码,只能提供用户/密码与私钥 ssh 中的密码。
假设您正在使用 Jenkins - 因为您就是我。我们可以按照以下策略解决问题:
- 获取密钥和密码
- 设置 ssh 包装器以自动使用密钥文件
- 设置 ssh-agent 以启用密码配置并根据 ssh 请求自动分发
- 使用 expect 在 ssh-agent 中安装密码
感谢@jayhendren 让我了解ssh-agent 插件
Jenkins 管道 Groovy 代码
/**
* generate stand in executable for ssh to ensure we use the correct id and do not look in home's .sshdir
* @return path to shell script wrapper for ssh
*/
def getSshWrapper(def keyPath) {
def wrapper = "${pwd()}/ssh"
writeFile file: wrapper, text: """#!/usr/bin/env sh
/bin/ssh -i ${keyPath} \$*"""
sh "chmod 700 ${wrapper}"
return wrapper
}
/**
* Enable ssh and git to use a deploy key with a passphrase
* @param credentialId jenkins id of private key / passphrase
* @param closure actions to perform
* @return result of actions
*/
def withDeployKey(def credentialId, closure) {
def result
// Start ssh agent and add key
def helperFilesDir = './build/helperFiles'
def envSettings = ["PATH=${helperFilesDir}:${env.PATH}"]
withEnv(envSettings) {
withCredentials([sshUserPrivateKey(credentialsId: credentialId,
passphraseVariable: 'PASSPHRASE',
keyFileVariable: 'KEY_FILE_PATH')]) {
println "Setup Ssh Wrapper to use credentials key"
dir(helperFilesDir) {
getSshWrapper(KEY_FILE_PATH)
}
// Run closure
println "run closure"
sshagent(credentials: [credentialId]) {
result = closure()
}
}
}
return result
}
例子
withDeployKey('my-deploy-key') {
sh "git clone git@github:me/myrepo.git'
}
答案2
您必须passphrase
向sshpass
使用-P
开关提供提示,它才会像魔法一样工作,例如每当我输入git pull
提示时要求输入我的密码:
Enter passphrase for key '/home/sinux/.ssh/id_ed25519':
因此我必须使用sshpass
如下方法:
sshpass -P "Enter passphrase for key '/home/sinux/.ssh/id_ed25519':" -p <passphrase> git pull
我已经测试过这种方法并在我的脚本中广泛使用了它,希望它也适合你。