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

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':

решение1

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

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

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

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

Код конвейера Jenkins Groovy

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

решение2

Вам нужно задать passphraseзапрос для sshpassиспользования -Pпереключателя, и это будет работать как по волшебству, например, всякий раз, когда я ввожу git pullзапрос, запрос на ввод моей парольной фразы будет выглядеть так:

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

Поэтому мне придется использовать sshpassчто-то вроде следующего:

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

Я опробовал этот метод и широко использовал его в своих сценариях. Надеюсь, он сработает и у вас.

Связанный контент