
Кто-нибудь обнаружил, что 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
Я опробовал этот метод и широко использовал его в своих сценариях. Надеюсь, он сработает и у вас.