GNU screenからssh-agentを使う

GNU screenからssh-agentを使う場合、エージェントソケットのシンボリックリンクを張るのが常道のようなのだが、WSL環境でホームディレクトリをdrvfsにしているとunix domain socketとシンボリックリンクの相性が悪いようでどうにもうまく動かなかった。

そこで思い切ってRubyunix domain socketをトンネルするツールを作ることにした。

github.com

ツールを使って.bashrcに次のように設定。 ssh-agentはログイン時に起動済みの想定。

 # ssh-agent forwarding in GNU Screen session
 if [ -n "$PS1" ]; then          # for interactive shell
   saved_ssh_agent_sock="${HOME}/.ssh/agent_sock"
   unix_socket_tunnel="${HOME}/git_work/unix_socket_tunnel/unix_socket_tunnel"

   if [ -n "${SCREEN_SESSION}" ]; then # add to .screenrc: setenv SCREEN_SESSION 1
     export SSH_AUTH_SOCK="${saved_ssh_agent_sock}"
   elif shopt -q login_shell && [ -n "${SSH_AUTH_SOCK}" ] && [ -S "${SSH_AUTH_SOCK}" ]; then
     rm -f "${saved_ssh_agent_sock}"
     "${unix_socket_tunnel}" "${SSH_AUTH_SOCK}" "${saved_ssh_agent_sock}" &
   fi
 fi

.screenrcにも忘れずに設定追加。

setenv SCREEN_SESSION 1

これで常に最新のssh-agentソケットをGNU screenの中から使えるようになった。