PF-X.NET Diary このページをアンテナに追加 RSSフィード

2004 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 02 | 03 | 04 | 05 | 06 | 07 |
2011 | 08 |
2012 | 03 | 09 | 10 | 12 |
2013 | 04 | 08 |
2014 | 03 | 05 |
2015 | 09 |

2013-04-07

tmuxssh-agent 18:39 tmuxとssh-agentを含むブックマーク

クラスタなどを管理していると,tmuxなどターミナルマルチプレクサが便利だが,ssh-agent(forward)周りが面倒なことになる.

というのも,ssh-agentは環境変数SSH_AUTH_SOCKに入っているUNIXドメインソケットからアクセスできるようになっていて,これがログインの度に変わる.

しかし,tmuxの中では環境変数がそれに追随しないので,一旦detachしてlogoutした後,再度attachするとssh-agentにアクセス出来なくなる問題が起こる.

これを解決するために,SSH_AUTH_SOCKにシンボリックリンクを指定し,シェルを立ち上げる度にそれを張替えるという方法があるが,結構はまりどころが多い.

少し調べると,以下のようなものを.bashrcなどに書く方法が見つかる.

SOCK="/tmp/ssh-agent-$USER"
if test $SSH_AUTH_SOCK && [ $SSH_AUTH_SOCK != $SOCK ]
then
        rm -f $SOCK
        ln -sf $SSH_AUTH_SOCK $SOCK
        export SSH_AUTH_SOCK=$SOCK
fi

確かにこれで,単にdetach→attachする分には問題なくなる.

しかし,2台のクライアントから同一サーバログインしたり,画面分割したpaneの両方で別のあるノードログインしたりといった場合に都合が悪い.

クライアントAがログインシンボリックリンクはAのagent

クライアントBがログインシンボリックリンクはBのagent

クライアントBがログアウト,リンク先は無効

クライアントAでagentが使えない

解決方法はいくつかありそうだが,とりあえず以下のようにしてみた.

ログイン時(.bashrcなど):

自分のSSH_AUTH_SOCKを別の環境変数に保存しておく

シンボリックリンク先が有効でなければ,自分の持ってきたagentにリンクを張替える

・SSH_AUTH_SOCKはシンボリックリンクを指しておく

ログアウト時(.bash_logoutなど):

今のリンク自分のagentを指していた場合,自分以外の有効なagentがあればリンク先をそちらに変更,無ければ消す.

きちんとした検証はしていないが,クラスタ内を自由に移動しても問題は起きなくなったので,ひとまずOKかと.

トラックバック - http://d.hatena.ne.jp/xabre/20130407