
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:
- Schlüssel und Passphrase erhalten
- Richten Sie den SSH-Wrapper so ein, dass die Schlüsseldatei automatisch verwendet wird.
- Richten Sie den SSH-Agenten ein, um die Bereitstellung der Passphrase und die automatische Ausgabe auf Anfrage per SSH zu ermöglichen.
- 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 passphrase
Eingabeaufforderung an den sshpass
Using -P
-Schalter weitergeben, und dieser funktioniert einwandfrei. Wenn ich beispielsweise git pull
die 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 sshpass
Folgendes 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.