🔖

SSH経由の git clone を完全非対話で行いたい

2021/01/31に公開

行いたいこと

CI などで使うスクリプトから ssh 経由で git clone したい。
対話(yes/no を聞かれるとか password/passphrase を聞かれる)が発生するとそこで停止(無応答)になってしまうのでそれを抑制したい。

行ったこと

  1. ssh-keygen で秘密鍵(~/.ssh/id_rsa)と公開鍵(~/.ssh/id_rsa.pub)を作る、この時パスフレーズは設定しない
  2. ssh サーバー(ここでは github)に、公開鍵(id_rsa.pub)を登録
  3. ~/.ssh/confighost *StrictHostKeyChecking no と設定(Are you sure you want to continue connecting (yes/no)? を出さないようにするため)
  4. git clone git@github.com:amay077/hoge.git を実行
  5. 成功

ここまで(正常系)は問題なし。

具体的に発生した問題

クライアントの ~/.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