Назад | Перейти на главную страницу

git clone зависает во время клонирования при использовании sshpass

Кто-нибудь обнаружил, что sshpass работает для установки фазовой фразы для клонов ssh или git?

У меня есть репозиторий github с ключом развертывания и кодовой фразой

Это приводит к тому, что запрашивается кодовая фраза, как и ожидалось, и клонируется при ее вводе вручную.

git clone git@github:me/myrepo.git

Это приводит к зависанию

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

Кажется, это происходит потому, что строка поиска никогда не будет соответствовать фактической строке, но, похоже, нет возможности изменить строку поиска.

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

Это потому, что вы не можете использовать sshpass для предоставления парольной фразы, только пароль в пользовательском / пароле против закрытого ключа ssh.

Предполагая, что вы используете Jenkins - а так как вы меня, то и есть. мы можем решить проблему, следуя этой стратегии:

  1. получить ключ и кодовую фразу
  2. настроить оболочку ssh для автоматического использования ключевого файла
  3. настроить ssh-agent, чтобы включить предоставление парольной фразы и автоматическую раздачу по запросу ssh
  4. используйте команду expect для установки парольной фразы в ssh-agent

спасибо @jayhendren за то, что включил меня плагин ssh-agent

Отличный код конвейера 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
}

пример

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