git clone trava durante a clonagem ao usar sshpass

git clone trava durante a clonagem ao usar sshpass

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:

  1. obter chave e senha
  2. configure o wrapper ssh para usar o arquivo-chave automaticamente
  3. configure o ssh-agent para permitir o provisionamento de senha e distribuição automática mediante solicitação do ssh
  4. 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 passphraseprompt para o switch sshpassusing -Pe ele funcionará perfeitamente, por exemplo, sempre que eu inserir git pullo prompt solicitando minha senha, seria:

Enter passphrase for key '/home/sinux/.ssh/id_ed25519':

Portanto eu teria que usar sshpasscomo 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.

informação relacionada