再接続するときにtmuxで環境変数をリセットする必要があるのはなぜですか?

再接続するときにtmuxで環境変数をリセットする必要があるのはなぜですか?

私は主にMacで作業し、作業を行うためにSSH / tmuxを介してLinuxシステムに接続します。 Linuxシステムでssh-agentを実行しています。私は持っています

set -g update-environment "SSH_AUTH_SOCK SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY"

私の.tmux.conf。ただし、このセッションに再接続するたびに、次を実行する必要があります。

tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK

$SSH_AUTH_SOCK新しいtmuxウィンドウを正しく設定するには、次の手順を実行します。むしろこのようなことをする必要はありません。どんなアイデアがありますか?

修正する

私はこの部分をよく説明していないようです。これはリモートシステムでシェルを開くシェル関数です。

sshh () {
    tmux -u neww -n ${host} "ssh -Xt ${host} $*"
}

tmuxがこのsshコマンドを実行すると、$SSH_AUTH_SOCK次のようになります。いいえ設定してもはい私のローカル環境で設定します。上記のコマンドを使用してtmux環境に配置すると、setenvすべてがうまく機能します。私の質問はなぜsetenvコマンドを実行するのですか?

アップデート2

追加情報:

既存のセッションに接続すると、$SSH_AUTH_SOCKtmux環境(またはグローバル環境)には設定されません。

% tmux showenv | grep -i auth_sock
-SSH_AUTH_SOCK

手動で設定すると、すべてがうまく機能します。

% tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK

取り外してから再接続すると、$SSH_AUTH_SOCK設定解除状態に戻ります。

答え1

賞金をいただきましたので、完全性のために批判的レビューを再度投稿いたします。同じ問題を抱えている訪問者が間違ったパスに置かないようにするには:

Tmuxは環境変数を削除します

Tmuxのマニュアルページには、アップデート環境が変数を削除することが示されています。"[...] は、-r が set-environment コマンドで指定されたようにソース環境には存在しません。"

明らかにそれが問題の原因です。バラよりChrisの答えは次のとおりです。。しかし、変数が「ソース環境」には存在しませんが、新しく作成されたtmuxウィンドウではどのように有効であるかはまだ想像できません。


前の答え:

SSH配信の仕組み

リモートコンピュータでSSH接続を確立したら、シェル環境を確認します。

user@remote:~$ env | grep SSH
SSH_CLIENT=68.38.123.35 45926 22
SSH_TTY=/dev/pts/0
SSH_CONNECTION=68.38.123.35 48926 10.1.35.23 22
SSH_AUTH_SOCK=/tmp/ssh-hRNwjA1342/agent.1342

ここで最も重要なのは、現在/tmpにファイルに設定されているSSH_AUTH_SOCKです。このファイルを見ると、Unixドメインソケットであり、接続されたSSHの特定のインスタンスに接続されていることがわかります。重要なことは、接続するたびに変更されることです。

ログアウトすると、特定のソケットファイルが消えます。 tmuxセッションに再接続すると、問題が表示されます。 tmuxが最初に起動したときの環境を持っています。おそらく数週間前でしょう。その特定のソケットはずっと前に死んだ。

解決策

問題は、現在アクティブなSSH認証ソケットがどこにあるかを知ることに関連していることを知っているので、予測可能な場所に置きましょう!

リモートシステムの.bashrcファイルまたは.zshrcファイルに次のコンテンツを追加します。

# Predictable SSH authentication socket location.
SOCK="/tmp/ssh-agent-$USER-screen"
if test $SSH_AUTH_SOCK && [ $SSH_AUTH_SOCK != $SOCK ]
then
    rm -f /tmp/ssh-agent-$USER-screen
    ln -sf $SSH_AUTH_SOCK $SOCK
    export SSH_AUTH_SOCK=$SOCK
fi

tmux.confに「環境更新コマンド」を追加する必要さえないと思います。 ~によるとマニュアルページ、SSH_AUTH_SOCK がデフォルトで適用されました。

クレジット取引

私の答えは抜粋ですこのブログ投稿投稿者:同じ問題を説明するMark 'xb95' Smith画面

答え2

私はこれを理解しています。簡単に答えると、SSH_AUTH_SOCKから削除する必要がありますupdate-environment。そのリストにあるため、再接続するたびにその値が消去されます。ヒントをくれた@djfに感謝します。 tmux(1) マニュアルページの重要なセクションupdate-environment

ソース環境に存在しないすべての変数は、セッション環境から削除されるように設定されます(set-environmentコマンドに-rが指定されているかのように)。

答え3

SSHエージェントを処理するためにtmuxを使用する代わりに、bashを使用して処理しています。

### SSH Agent ### {{{
SSH_ENV="$HOME/.ssh/environment"

function start_agent {
    echo "Initialising new SSH agent..."
    /usr/bin/ssh-agent | sed 's/^echo/#echo/' > "${SSH_ENV}"
    echo succeeded
    chmod 600 "${SSH_ENV}"
    . "${SSH_ENV}" > /dev/null
    /usr/bin/ssh-add;
}

## Source SSH settings, if applicable
if [ -f "${SSH_ENV}" ]; then
    . "${SSH_ENV}" > /dev/null
    ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
        start_agent;
    }
  else
    start_agent;
fi
### End SSH Agent ### }}}

私の中にこれがあります〜/bashrc、非常にうまく動作します。

答え4

djfの説明は別の可能な解決策を提示しました。

操作前tmux/screen操作中:

  1. ログイン。
  2. インスタンスを起動しますssh-agent
  3. tmuxscreenこれの環境変数は/で始まりますssh-agent

これはSSHを使用してクライアントに渡すことはできませんが、そうする必要はありません。

関連情報