2020年4月12日日曜日

リモート接続時にssh鍵のパスフレーズ入力を最小限にする

GitHubに公開鍵でssh接続するように設定してあると、プライベートリポジトリをcloneするときなどに毎回パスフレーズの入力が求められる。こういうときにssh-agentを使用すると、パスフレーズの入力を省略できる。ただし、複数ターミナルで接続するときなどはターミナルごとにパスフレーズを入力することになるし、余計なプロセスを起動することにもなる。そこで、複数ターミナルで接続する場合でもパスフレーズ入力が一回で済むようにしてみる。


環境


環境はWSLのUbuntu。ssh鍵は設定済みで、秘密鍵のパスは~/.ssh/id_rsaとする。



ssh-agentの使い方


ssh-agentをそのまま実行すると、環境変数SSH_AUTH_SOCKとSSH_AGENT_PIDに値を設定してexportするコマンドが出力される。


この出力されたコマンドをそのまま実行すればよいわけだが、evalコマンドを使うとssh-agentが出力した内容を実行してくれるので自分で実行する手間が省ける。


ssh-agentが起動できたら、ssh-addコマンドでパスフレーズを登録する。


これでGitHubのプライベートリポジトリをcloneするときなどにパスフレーズの入力を求められずにsshでcloneできるようになる。


リモート接続時にssh-agentプロセスを再利用する


ただ、exportコマンドの設定は接続したターミナルでのみ有効なので、一度切断して再接続したり別のターミナルで接続したりすると、ssh-agentのプロセスは起動していても再度exportで環境変数を設定する必要がある。さらに、ssh-agentを実行してexportを再設定すると無駄にssh-agentプロセスが起動することにもなる。

そんな場合のためにSSH キーパスフレーズを使うにスクリプトが用意されている。このページのスクリプトを~/.bashrcに追記することで、ターミナルで再接続したり別のターミナルで接続してもssh-agentのパスフレーズ再入力を不要にできる。

以下スクリプトはSSH キーパスフレーズを使うからの引用。
env=~/.ssh/agent.env

agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }

agent_start () {
    (umask 077; ssh-agent >| "$env")
    . "$env" >| /dev/null ; }

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi

このスクリプトでは、ssh-agentの出力結果を~/.ssh/agent.envに保存しておき、スクリプト実行時に保存しておいた内容を実行する。

これでssh鍵のパスフレーズ入力はターミナル接続の初回のみで済むし、余計なssh-agentプロセスを起動せずに済む。

0 件のコメント:

コメントを投稿