このssh-agentは便利なのですが、何も考えずに利用しているとターミナル毎に個別にssh-agentを起動する羽目になり、気がつくとssh-agentが複数動いている、という状況に陥ってしまいます。
これはssh,sftp,scpなどのクライアントツールが、ssh-agentを利用するために2つの環境変数(SSH_AUTH_SOCKとSSH_AGENT_PID)を参照しているためです。逆に言うと、これらの環境変数をターミナル間で共有することができれば、ssh-agentをその都度起動しなくてもよくなり、共有することができます。
このブログで見つけたシェルスクリプトを.bashrc(もしくは.tcshrc)に追加することで、ターミナル起動時(=シェル起動時)に以下のお世話をしてくれます。
- ssh-agentが起動済みかどうかをチェック
- 未起動であれば起動
- 2つの環境変数を$HOME/.ssh/environmentに記録
- その後、ssh-addコマンドも実行してパスフレーズ入力を促す
- 起動済であれば、2つの環境変数の設定を引き継ぐ
SSH_ENV=”${HOME}/.ssh/environment” SSHAGENT=/usr/bin/ssh-agent SSHAGENTARGS=”-s” function start_agent { echo -n “Initialising new SSH agent…” ${SSHAGENT} | sed ‘s/^echo/#echo/’ > “${SSH_ENV}” echo succeeded chmod 600 “${SSH_ENV}” . “${SSH_ENV}” > /dev/null ssh-add } # Source SSH settings, if applicable if [ -f “${SSH_ENV}” ]; then . “${SSH_ENV}” > /dev/null #ps ${SSH_AGENT_PID} doesn’t work under cywgin ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || { start_agent; } if [[ -z `ssh-add -l | grep “${HOME}/.ssh/id_”` ]]; then ssh-add fi else start_agent; fi
.tcshrcへの追加スクリプト(前述ブログのbashスクリプトをtcshスクリプトにポート)
setenv SSH_ENV "$HOME/.ssh/environment" setenv SSHAGENT `which ssh-agent` setenv SSHAGENTARGS "-c" if ( -f "${SSH_ENV}" ) then source "${SSH_ENV}" ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent > /dev/null if ( $status == 1 ) then #echo "no agent found." goto call_start_agent endif ssh-add -l | grep "${HOME}/.ssh/id_" > /dev/null if ( $status == 1 ) then #echo "no key added." goto call_ssh_add endif else goto call_start_agent endif goto exit_ssh # Source SSH settings, if applicable call_start_agent: echo -n "Initialising new SSH agent... " ${SSHAGENT} | sed 's/^echo/#echo/' > "${SSH_ENV}" echo succeeded chmod 700 "${SSH_ENV}" source "${SSH_ENV}" call_ssh_add: ssh-add exit_ssh:
0 件のコメント:
コメントを投稿