
Alguém descobriu que o sshpass funciona para definir uma frase de fase para clones ssh ou git?
Eu tenho um repositório no GitHub com uma chave de implantação e uma senha
Isso resulta na solicitação da senha conforme o esperado e na clonagem após digitação manual dela
git clone git@github:me/myrepo.git
Isso resulta em um travamento
sshpass -p "secret" -v git clone git@github:me/myrepo.git
Isso parece acontecer porque a string de pesquisa nunca corresponderá à string real, mas parece não haver maneira de alterar a string de pesquisa.
SSHPASS searching for password prompt using match "assword"
SSHPASS read: Enter passphrase for key '/home/jenkins/.ssh/id_rsa':
Responder1
Isso ocorre porque você não pode usar sshpass para fornecer uma senha, apenas uma senha em usuário/senha versus chave privada ssh.
Supondo que você esteja usando Jenkins - e já que você é eu, você está. podemos resolver o problema seguindo esta estratégia:
- obter chave e senha
- configure o wrapper ssh para usar o arquivo-chave automaticamente
- configure o ssh-agent para permitir o provisionamento de senha e distribuição automática mediante solicitação do ssh
- use expect para instalar a senha no ssh-agent
obrigado a @jayhendren por me mostrar oPlug-in do agente ssh
O código bacana do pipeline Jenkins
/**
* 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
}
Exemplo
withDeployKey('my-deploy-key') {
sh "git clone git@github:me/myrepo.git'
}
Responder2
Você tem que fornecer o passphrase
prompt para o switch sshpass
using -P
e ele funcionará perfeitamente, por exemplo, sempre que eu inserir git pull
o prompt solicitando minha senha, seria:
Enter passphrase for key '/home/sinux/.ssh/id_ed25519':
Portanto eu teria que usar sshpass
como abaixo:
sshpass -P "Enter passphrase for key '/home/sinux/.ssh/id_ed25519':" -p <passphrase> git pull
Testei esse método e o usei amplamente em meus scripts, espero que funcione para você também.