切断されたtmuxセッションに再接続したときにSSHエージェントを復元する良い方法を見つけようとしています。
原因は、SSHエージェントセッションが変更されたが、tmuxセッションからの環境変数が更新されていないためと思われます。
セッション自体をアタッチする前に、これをどのように自動化できますか?私がアタッチするセッションには常にbashプロンプトが表示されないため、その中に何かを入力する余裕はありません。 tmuxセッションを作成または接続する前に実行する必要があります。
私が実行しているコードの例は https://Gist.github.com/ssbarnea/8646491 -tmuxを使用して永続的なssh接続を作成している小さなsshラッパーです。これは非常にうまく機能しますが、sshエージェントが機能しなくなることがあるため、他のホストへの接続に使用できなくなりました。
Martijn Vermaatによる優れた Gist があります。これは、画面ユーザーを対象としていますが、問題を深く掘り下げているので、ここでtmuxに合わせて調整しています。
要約する:
作成~/.ssh/rc
まだ存在しない場合は、次のコンテンツを追加します。
#!/bin/bash
# Fix SSH auth socket location so agent forwarding works with tmux
if test "$SSH_AUTH_SOCK" ; then
ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi
Tmuxで動作するようにし、これを~/.tmux.conf
:
# fix ssh agent when tmux is detached
setenv -g SSH_AUTH_SOCK $HOME/.ssh/ssh_auth_sock
X11転送を有効にする場合は、追加の作業が必要です。 Gist を参照してください。
デフォルトではtmux
pdatesSSH
変数ですが、必要はありません
SSH_AUTH_SOCKET
変数を変更するChris Down による解決策が好き
fixssh() {
eval $(tmux show-env \
|sed -n 's/^\(SSH_[^=]*\)=\(.*\)/export \1="\2"/p')
}
~/.bashrc
に。セッションをアタッチした後、またはfixssh
/ssh
/scp
の前にrsync
を呼び出します。
tmux
の新しいバージョンは、-s
のshow-env
オプションをサポートしているため、
eval $(tmux show-env -s |grep '^SSH_')
可能だ。
tmux
ウィンドウ内でSSH_AUTH_SOCK
を更新するために使用するものは次のとおりです(Hans Ginzelのスクリプトに基づく)。
alias fixssh='eval $(tmux showenv -s SSH_AUTH_SOCK)'
またはshowenv -s
を持たないtmux
の場合:
alias fixssh='export $(tmux showenv SSH_AUTH_SOCK)'
ここに両方のアプローチを含む私のソリューションがあり、tmuxセッションに再接続するときに余分な入力を必要としません
alias ssh='[ -n "$TMUX" ] && eval $(tmux showenv -s SSH_AUTH_SOCK); /usr/bin/ssh'
以前の回答のバリエーションを使用します。
eval "export $(tmux show-environment -g SSH_AUTH_SOCK)"
sshエージェントを外部環境から開始したと仮定します。 DISPLAY
などの他の環境変数についても同様です。
ここにはたくさんの良い答えがあります。ただし、_tmux show-environment
_が_SSH_AUTH_SOCK
_を認識しない場合があります。その場合、find
を使用して明示的に見つけることができます。
_export SSH_AUTH_SOCK=$(find /tmp -path '*/ssh-*' -name 'agent*' -uid $(id -u) 2>/dev/null | tail -n1)
_
それは長くて複雑なので、私はそれを分解します...
_01 export SSH_AUTH_SOCK=$(
02 find /tmp \
03 -path '*/ssh-*'
04 -name 'agent*'
05 -uid $(id -u)
06 2>/dev/null
07 | tail -n1
08 )
_
export
$()
コマンド置換の出力に設定された_SSH_AUTH_SOCK
_環境変数/tmp
_で始まるfind
ファイル/ssh-
_を含むもののみに結果を制限するagent
で始まるもののみに結果を制限します結果が1つしかなく、stderrのゴミを気にしないことがわかっている場合は、6と7を省略できる場合があります。
TMUX(など)の設定を避け、すべてを~/.ssh/
に保持することを好みます。 リモートシステムの場合:
~/.ssh/rc
を作成:
#!/bin/bash
# Fix SSH auth socket location so agent forwarding works within tmux
if test "$SSH_AUTH_SOCK" ; then
ln -sf $SSH_AUTH_SOCK ~/.ssh/ssh_auth_sock
fi
以下を~/.ssh/config
に追加して、分離された端末では古くなる$SSH_AUTH_SOCK
に依存しないようにします。
Host *
IdentityAgent ~/.ssh/ssh_auth_sock
ssh-add
は~/.ssh/config
を使用しないため、ssh-agent
と通信できません。 ssh-add -l
のようなコマンドは、ssh user@Host
が正常に機能するにもかかわらず、SSH経由でアクセスされるgitリモートの更新と同様にエラーを生成します。