Kenichi Maehashi's Blog

脳内コアダンプ

RSS
Category: Linux
細かすぎて他の人に伝わりにくい話なのですが忘れないようにメモ。

要件としては、
  • ssh-agent をローカルマシンで立ち上げて、Agent Forwarding を有効にしてリモートマシンに接続する
  • リモートマシンでは screen を使用して、その中のシェルで Forward された Agent を使用する
の 2 点。

Agent Forwarding を使用するとリモートマシン上にソケットファイルが作成され、環境変数 SSH_AUTH_SOCK にそのソケットファイルのパスが設定されるわけですが、screen を detach & 再 attach しても、screen 内で既に起動しているシェルの環境変数は変わりません。このため、ssh 接続 (ソケット 1 生成) > screen 起動 > 作業 > screen detach > ssh 切断 (ソケット 1 削除) > ssh 接続 (ソケット 2 作成) > screen attach > SSH Agent が使えなくなってる...! (環境変数の SSH_AUTH_SOCK はソケット 1 を指したままになっているため) という問題が発生します。

解決策として、zshrc で「起動時に、もし SSH_AUTH_SOCK にソケットファイルが存在したら、設定ファイルにパスを書き出しておく」「precmd フック (プロンプト表示時に呼び出される) で設定ファイルを毎回読み込む」というハックを書いてみたら便利になって満足。毎回設定ファイルを読み出すオーバヘッドは無視できるレベルなので気にしない。

ただ、SSH が異常終了した場合 (上記の「ソケット 1 削除」が行われないケース) はダメな気がする。Unix Domain Socket の生存確認ってシェルスクリプトから簡単にできるのだろうか... (nc -U とか使えばできそうな気もするけど、ちょっとツライ感じ)。

Comments

Leave Yours...
Name:
E-mail / URL (optional):
Comment:
Are You Robot?: