使用 sshpass 克隆时 git clone 挂起

使用 sshpass 克隆时 git clone 挂起

是否有人发现 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

您必须passphrasesshpass使用-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

我已经测试过这种方法并在我的脚本中广泛使用了它,希望它也适合你。

相关内容