web-dev-qa-db-ja.com

既存のtmuxセッションにアタッチするときにSSHエージェント環境変数を自動更新する方法

切断されたtmuxセッションに再接続したときにSSHエージェントを復元する良い方法を見つけようとしています。

原因は、SSHエージェントセッションが変更されたが、tmuxセッションからの環境変数が更新されていないためと思われます。

セッション自体をアタッチする前に、これをどのように自動化できますか?私がアタッチするセッションには常にbashプロンプトが表示されないため、その中に何かを入力する余裕はありません。 tmuxセッションを作成または接続する前に実行する必要があります。

私が実行しているコードの例は https://Gist.github.com/ssbarnea/8646491 -tmuxを使用して永続的なssh接続を作成している小さなsshラッパーです。これは非常にうまく機能しますが、sshエージェントが機能しなくなることがあるため、他のホストへの接続に使用できなくなりました。

61
sorin

Martijn Vermaatによる優れた Gist があります。これは、画面ユーザーを対象としていますが、問題を深く掘り下げているので、ここでtmuxに合わせて調整しています。

要約する:

  1. 作成~/.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
    
  2. Tmuxで動作するようにし、これを~/.tmux.conf

    # fix ssh agent when tmux is detached
    setenv -g SSH_AUTH_SOCK $HOME/.ssh/ssh_auth_sock
    

X11転送を有効にする場合は、追加の作業が必要です。 Gist を参照してください。

73
pymkin

デフォルトではtmuxpdatesSSH変数ですが、必要はありません

  • ソケットパスの変更/追加
  • SSH_AUTH_SOCKET変数を変更する

Chris Down による解決策が好き

fixssh() {
    eval $(tmux show-env    \
        |sed -n 's/^\(SSH_[^=]*\)=\(.*\)/export \1="\2"/p')
}

~/.bashrcに。セッションをアタッチした後、またはfixssh/ssh/scpの前にrsyncを呼び出します。

tmuxの新しいバージョンは、-sshow-envオプションをサポートしているため、

eval $(tmux show-env -s |grep '^SSH_')

可能だ。

30
Hans Ginzel

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)'
19
user1338062

ここに両方の​​アプローチを含む私のソリューションがあり、tmuxセッションに再接続するときに余分な入力を必要としません

alias ssh='[ -n "$TMUX" ] && eval $(tmux showenv -s SSH_AUTH_SOCK); /usr/bin/ssh'
6
Max

以前の回答のバリエーションを使用します。

eval "export $(tmux show-environment -g SSH_AUTH_SOCK)"

sshエージェントを外部環境から開始したと仮定します。 DISPLAYなどの他の環境変数についても同様です。

3
Raffi

ここにはたくさんの良い答えがあります。ただし、_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  )
_
  1. export$()コマンド置換の出力に設定された_SSH_AUTH_SOCK_環境変数
  2. _/tmp_で始まるfindファイル
  3. パスに_/ssh-_を含むもののみに結果を制限する
  4. 名前がagentで始まるもののみに結果を制限します
  5. 現在のユーザーと一致するユーザーIDを持つ結果のみに結果を制限します
  6. すべての(許可などの)エラーを黙らせる
  7. 複数ある場合は最後の結果のみを取得します

結果が1つしかなく、stderrのゴミを気にしないことがわかっている場合は、6と7を省略できる場合があります。

2
Bruno Bronosky

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リモートの更新と同様にエラーを生成します。
1
RobM