SSH経由の git clone を完全非対話で行いたい
行いたいこと
CI などで使うスクリプトから ssh 経由で git clone したい。
対話(yes/no を聞かれるとか password/passphrase を聞かれる)が発生するとそこで停止(無応答)になってしまうのでそれを抑制したい。
行ったこと
-
ssh-keygen
で秘密鍵(~/.ssh/id_rsa
)と公開鍵(~/.ssh/id_rsa.pub
)を作る、この時パスフレーズは設定しない - ssh サーバー(ここでは github)に、公開鍵(
id_rsa.pub
)を登録 -
~/.ssh/config
でhost *
をStrictHostKeyChecking no
と設定(Are you sure you want to continue connecting (yes/no)?
を出さないようにするため) -
git clone git@github.com:amay077/hoge.git
を実行 - 成功
ここまで(正常系)は問題なし。
具体的に発生した問題
クライアントの ~/.ssh/id_rsa
を書き換えて「秘密鍵が正しくない」状態を作り、
git clone git@github.com:amay077/hoge.git
を実行。
すると
Enter passphrase for key '~/.ssh/id_rsa':
という 「パスフレーズを入力させるという対話処理」 が出てしまう。
CI に組み込んで実行すると、ここで無応答になってしまう。
「パスフレーズを入力させるという対話処理」 を出さずに異常を示す終了コードを返却させたい。
解決した方法
GIT_SSH_COMMAND="ssh -o BatchMode=yes" git clone git@github.com:amay077/hoge.git
を使う。
これにより「秘密鍵が正しくない」状態でも「パスフレーズを入力させるという対話処理」が出ずに、異常を示すコード(255)を返却する。
尚、正しい秘密鍵で成功した際はコード「0」が返却される。
結果、bashスクリプトとしてはこう↓なった。
#!/bin/bash
GIT_SSH_COMMAND="ssh -o BatchMode=yes" git clone git@github.com:amay077/hoge.git
retval=$?
if [ $retval -ne 0 ]; then
echo "ERR! - ソース取得失敗($retval)"
exit 1
fi
おまけ
そもそも git でなく ssh の話で、ssh 単体でも、
ssh -o BatchMode=yes git@github.com
で非対話での接続テストができる。
github は (たいていの git サーバーは) terminal による接続を受け付けていないので、秘密鍵が正しくても「1」が返却されるようだ。秘密鍵が正しくない時は「255」が返却される。
Discussion