スクリプトによるSSH認証を使用したgit pullの自動化(非対話型)

スクリプトによるSSH認証を使用したgit pullの自動化(非対話型)

Gitを介して非対話式に自動更新したいUbuntu 20.04 Serverを実行するRaspberry Piがたくさんあります。

スクリプトは次のことを行います。

eval "$(ssh-agent -s)" ; ssh-add /home/michael/.ssh/terminal_github_deploy_key ; git -C /home/michael/terminal/src pull

このスクリプトは実際にPythonで書かれていますが、上記と同じことを行います。

cmds = []
cmds.append('eval "$(ssh-agent -s)"')
cmds.append(f'ssh-add {HOME_DPATH}/.ssh/terminal_github_deploy_key')
cmds.append(f'git -C {CHECKOUT_DPATH} pull')
cmd = ' ; '.join(cmds)
subprocess.check_call(cmd, shell=True)

この対話型警告を発生させることを除いて、うまく機能します。

The authenticity of host 'github.com (140.82.121.3)' can't be established.
ECDSA key fingerprint is SHA256:...
Are you sure you want to continue connecting (yes/no/[fingerprint])?

yes | ...研究によると、セキュリティ上の理由から意図的にパイプを許可しません(したがって動作しません)。警告が発生する原因が何であるかよくわかりません。 Gitで呼び出すSSHのようですが、無視する方法がわかりませんか?必ずしも使用する必要はありませんが、ssh-addこれを機能させる方法です。

答え1

次のような他のスクリプトを書く必要はありません。予想される、あなたがいるときバニラ

最も簡単な方法は追加することです。Githubホストキー到着 .ssh/known_hosts

編集:サーバーが多く、サイトのコンテンツが別々のホストキーではないため、これは不可能です。

それ以外の場合は、次のものを使用できます。GitPythonオートメーション

答え2

上記の@Wielandの答えと似ていますが、少し優れています。スクリプトホストキー検証を無効にする代わりに、接続を試みる前にSSHに公開鍵をインポートするように要求できます。

$ export MACHINE_IP=...
$ ssh-keyscan "$MACHINE_IP" | tee -a ~/.ssh/known_hosts
$ ./path/to/script

これがSSHアクセス(たとえばAnsible)を必要とするCICDワークフローを設定する方法です。この場合、IPは静的であるため、どこかに保存し、~/.ssh/known_hostsスクリプトを実行する前にCICDパイプラインにファイルを追加するようにしてください。

IPアドレスの代わりにFQDNを使用することもできますが、ホストが現在または将来複数のIPアドレスで解決できる動的DNSの動作を知っている必要があります。

答え3

以下を設定して、SSH-through-gitのホストキー検証を無効にできますStrictHostKeyChecking=no

このオプションを使用すると、ユーザーはすべての新しいホストを手動で追加する必要があります。このフラグが「no」に設定されている場合、sshは自動的にユーザーが知っているホストファイルに新しいホストキーを追加します。

(からSSH構成(5))。git -c core.sshCommand='ssh -o StrictHostKeyChecking=no' pullSSHコマンドのようにgitを呼び出すと、gitはこのフラグをSSHに渡します。

関連情報