Ssh

使用 sshpass 時,git clone 在複製期間掛起

  • August 24, 2018

有沒有人發現 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 管道 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'
} 

引用自:https://serverfault.com/questions/927712