web-dev-qa-db-ja.com

要塞ホストのscreenまたはtmuxでのssh-agentキーのタイムアウト

通常、私はssh-agentを実行しています。要塞ホストにsshしてから、tmuxセッションを開き、それを介して他のボックスに接続します。キー転送は、その時点から開いたすべてのセッションで機能します。

ターミナルを閉じてラップトップをスリープ状態にした後でtmuxセッションを再開した場合でも、要塞セッションでのキー転送は、他のnewセッションでの転送と同様に機能します。ただし、既存のものは機能しません。

Bashrcには、tmuxを再開したときにキー転送が機能し続けることが少しありますが、tmux内で開いているセッションでキー転送を機能させ続ける方法がわかりません。

たとえば、bastion01、dbhost01、dbhost02、webhost01、およびwebhost02があります。

Bastion01への接続を開くと、そこでtmuxを起動してから、dbhost01に接続するとwebhost01の転送が機能します。その接続を閉じ、既存のtmuxセッションを再接続して接続し、dbhost02とwebhost02に接続を追加すると、キー転送は02ボックスでは機能しますが、01では機能しません。

助けてください!

8
Jericon

bastion01にSSHで接続するたびに、キー転送を処理するために異なるソケットが開かれます。ファイル名は環境変数SSH_AUTH_SOCKで確認できます。 tmuxを開始すると、その環境変数の値はtmuxのグローバル環境に含まれ、そのセッションで開始されたすべてのシェルに継承されます。

これで、後でbastion01に再接続すると、キー転送を処理するために別のソケットが割り当てられます(これは新しいsshセッションであるため)。これは、tmuxセッションに再接続する前と後にSSH_AUTH_SOCKの値を調べることで確認できます。キー転送がtmux内で機能するためには、tmux内のSSH_AUTH_SOCKの値を現在のsshセッションで使用されているソケットの名前に更新する必要があります。

これを行うための手っ取り早い方法は、この新しい値をファイルに保存する短いスクリプトを記述し、それをtmux- ingになる任意のsshウィンドウ内で実行することです。から。

#!/bin/bash

echo "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK" > ~/.auth_ssh

bastion01にSSHで接続するとすぐに、ただしtmuxセッションに再接続する前にそのスクリプトを実行します。次に、tmux内からどこかでsshを実行する前に、次のコマンドを実行します。

source ~/.auth_ssh

tmuxウィンドウには独自の環境があるため、sshを実行しようとする各ウィンドウでそれを実行する必要があります。簡単にするために、sshにエイリアスを付けてそれを行うことができます。

alias ssh="source ~/.auth_ssh; ssh"

注:これは、SSH認証情報を更新するために作業で使用するスクリプトを大幅に単純化しすぎたものです。それが完全に正しく機能しない場合、私はこれが少なくともあなたにもっと良い解決策をグーグルするのに十分な情報を与えることを願っています(または誰かがここにもっと良い解決策を投稿します)。

11
chepner