Ssh
使用 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':
那是因為您不能使用 sshpass 提供密碼,只能使用使用者/密碼與私鑰 ssh 中的密碼。
假設您正在使用 Jenkins - 既然您是我,那麼您就是。我們可以按照以下策略解決問題:
- 獲取密鑰和密碼
- 設置 ssh 包裝器以自動使用密鑰文件
- 設置 ssh-agent 以根據 ssh 的請求啟用密碼片語和自動分發
- 使用 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' }