git clone se bloquea durante la clonación cuando se usa sshpass

git clone se bloquea durante la clonación cuando se usa sshpass

¿Alguien ha descubierto que sshpass funciona para establecer una frase de fase para clones de ssh o git?

Tengo un repositorio de github con una clave de implementación y una frase de contraseña.

Esto da como resultado una solicitud de contraseña como se esperaba y una clonación al ingresarla manualmente.

git clone git@github:me/myrepo.git

Esto resulta en una caída

sshpass -p "secret" -v git clone git@github:me/myrepo.git

Esto parece suceder porque la cadena de búsqueda nunca coincidirá con la cadena real, pero no parece haber forma de modificar la cadena de búsqueda.

SSHPASS searching for password prompt using match "assword"
SSHPASS read: Enter passphrase for key '/home/jenkins/.ssh/id_rsa':

Respuesta1

Esto se debe a que no puede usar sshpass para proporcionar una frase de contraseña, solo una contraseña en usuario/contraseña versus clave privada ssh.

Suponiendo que estés usando Jenkins, y como eres yo, lo eres. Podemos resolver el problema siguiendo esta estrategia:

  1. obtener clave y frase de contraseña
  2. configurar el contenedor ssh para usar el archivo de claves automáticamente
  3. configurar ssh-agent para habilitar el aprovisionamiento de la frase de contraseña y el envío automático a petición de ssh
  4. use esperar instalar la frase de contraseña en ssh-agent

gracias a @jayhendren por incluirme en elcomplemento de agente ssh

El maravilloso código del oleoducto 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
}

Ejemplo

withDeployKey('my-deploy-key') {
   sh "git clone git@github:me/myrepo.git'
} 

Respuesta2

Tienes que darle el passphrasemensaje al interruptor sshpassde uso -Py funcionará de maravilla, por ejemplo, cada vez que entro, git pullel mensaje que me pide mi contraseña sería:

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

Por lo tanto, tendría que usar sshpasscomo el siguiente:

sshpass -P "Enter passphrase for key '/home/sinux/.ssh/id_ed25519':" -p <passphrase> git pull

Probé este método y lo usé ampliamente en mis scripts, espero que también funcione para ti.

información relacionada