2016年11月27日日曜日

ssh-agentのシェア

今日はssh-agentを複数ウィンドウでシェアする方法の説明です。

以前必要があって調べた時はすぐ出てきたんですが、chromebookの設定で再度調べたら全然欲しい情報がヒットしなかったので、まとめときます。

ssh-agentは、sshでログインする時のパス入力を自動化する仕組みです。詳細はググッてください。

ssh-keygenしてssh-copy-idしたら、後は.profileや.bash_profileに以下を書きます。

if [ -f ~/.ssh-agent ]; then
    . ~/.ssh-agent
fi
if [ -z "$SSH_AGENT_PID" ] || ! kill -0 $SSH_AGENT_PID; then
    ssh-agent > ~/.ssh-agent
    . ~/.ssh-agent
fi

これでssh-agentを一つだけ起動して、全てのウィンドウでそれをシェアします。毎回、ssh-addしなくて良くなるわけです。ログインしたら最初に一度だけssh-addしてください。後はそのパスフレーズを全てのウィンドウでシェアします。

最初のifで.ssh-agentファイルがあれば、そこに環境変数が書いてあるはずなのでロード。次のifで環境変数に問題があったり、設定されているプロセスが存在しなければ、ssh-agentの再起動をしています。

ssh-addなどで調べずkillで調べているのは、cygwinでうまく動作しなくなるからです。

利用する全てのマシンの.ssh/configには以下を書いておきましょう。

Host *
    ForwardAgent yes

リモートのリモートにも自動でログインできるようになります。

続けて、screen用の設定です。以下はsshで入ったリモートでscreenを動かして、その中から更にsshする人用の設定です。screenを使わないなら必要ありません。

sshしてscreenした直後は調子いいのに、一度detachするとssh-agentが効かなくなる問題への対策が、以下になります。

まず、.screenrcに以下を追加します。

setenv SSH_AUTH_SOCK $HOME/.ssh/ssh_auth_sock

そして、 ~/bin/screenとして以下のスクリプトを用意。

#!/bin/sh

# Fix SSH auth socket location so agent forwarding works with screen.
case .$SSH_AUTH_SOCK in
.$HOME/.ssh/ssh_auth_sock)
  # Called inside of screen, so nothing to do here
  ;;
*)
  if test "$SSH_AUTH_SOCK"; then
    ln -sf $SSH_AUTH_SOCK $HOME/.ssh/ssh_auth_sock
  fi;;
esac

# Execute screen
exec /usr/bin/screen "$@"

sshしてscreenした時の問題の原因は、sshする度に、SSH_AUTH_SOCKで接続すべき接続先が変わるのに、screen内の環境は変化しないことにあります。

ここでは、SSH_AUTO_SOCKをシンボリックリンクファイルに置き換えて、screenの度にシンボリックリンクを更新することで対策しています。

Happy hacking! :-)

0 件のコメント:

コメントを投稿