Git-Clone bleibt während des Klonens hängen, wenn SSHPass verwendet wird

Git-Clone bleibt während des Klonens hängen, wenn SSHPass verwendet wird

Hat jemand herausgefunden, dass es mit sshpass funktioniert, um eine Phrase für SSH- oder Git-Klone festzulegen?

Ich habe ein GitHub-Repo mit einem Deploy-Schlüssel und einer Passphrase

Dies führt wie erwartet zur Eingabeaufforderung für die Passphrase und zum Klonen bei manueller Eingabe.

git clone git@github:me/myrepo.git

Dies führt zu einem Hängenbleiben

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

Dies scheint darauf zurückzuführen zu sein, dass die Suchzeichenfolge nie mit der tatsächlichen Zeichenfolge übereinstimmt, es jedoch scheinbar keine Möglichkeit gibt, die Suchzeichenfolge zu ändern.

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

Antwort1

Dies liegt daran, dass Sie zum Bereitstellen einer Passphrase nicht „sshpass“ verwenden können, sondern nur ein Kennwort im Format „Benutzer/Kennwort“ im Vergleich zum privaten SSH-Schlüssel.

Vorausgesetzt, Sie verwenden Jenkins (und da Sie ich sind, ist das so), können wir das Problem mit der folgenden Strategie lösen:

  1. Schlüssel und Passphrase erhalten
  2. Richten Sie den SSH-Wrapper so ein, dass die Schlüsseldatei automatisch verwendet wird.
  3. Richten Sie den SSH-Agenten ein, um die Bereitstellung der Passphrase und die automatische Ausgabe auf Anfrage per SSH zu ermöglichen.
  4. verwenden Sie expect, um die Passphrase im SSH-Agenten zu installieren

danke an @jayhendren für den Hinweis auf dieSSH-Agent-Plugin

Der Groovy-Code der Jenkins-Pipeline

/**
 * 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
}

Beispiel

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

Antwort2

Sie müssen die passphraseEingabeaufforderung an den sshpassUsing -P-Schalter weitergeben, und dieser funktioniert einwandfrei. Wenn ich beispielsweise git pulldie Eingabeaufforderung eingebe, in der ich nach meiner Passphrase gefragt werde, lautet sie:

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

Daher müsste ich sshpassFolgendes verwenden:

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

Ich habe diese Methode getestet und sie häufig in meinen Skripten verwendet. Ich hoffe, dass sie auch bei Ihnen funktioniert.

verwandte Informationen