web-dev-qa-db-ja.com

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

私は主にMacで作業し、Linuxマシンにssh/tmuxを接続して作業を行います。 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

新しいtmuxウィンドウに$SSH_AUTH_SOCK正しく設定されています。私はこれをする必要がないことを望みます。何か案は?

更新

私はこれをうまく説明していないと思います。リモートマシンでシェルを開くためのシェル関数を次に示します。

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

Tmuxがこのsshコマンドを実行すると、$SSH_AUTH_SOCK is not set、it it is set of my local environment。これを上記のsetenvコマンドを使用してtmuxの環境に配置すると、すべて正常に動作します。私の質問は、なぜsetenvコマンドを実行する必要があるのですか?

アップデート2

詳しくは:

既存のセッションにアタッチすると、$SSH_AUTH_SOCKは、tmux環境(またはグローバル環境)では設定されません。

% tmux showenv | grep -i auth_sock
-SSH_AUTH_SOCK

手動で設定すると、次のように機能します。

% tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK

デタッチして再アタッチすると、$SSH_AUTH_SOCKは未設定に戻ります。

38
Chris W.

私はこれを理解しました。簡単に言えば、SSH_AUTH_SOCKからupdate-environmentを削除する必要がありました。そのリストにあったので、再装着する度にその価値は吹き飛ばされていました。手がかりを与えてくれた@djfに感謝します。 update-environmentセクションのtmux(1)マニュアルページからの重要なビット:

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

14
Chris W.

バウンティを受け取ったので、完全を期すためにキーコメントを再投稿します-間違ったトラックに同じ問題を持つ訪問者を設定することを避けるために:

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

Tmuxのマニュアルページには、update-environmentによって変数が削除されると記載されています"ソース環境に存在しない変数[...] -rがset-environmentコマンドに指定されたかのように" "

どうやらこれが問題の原因です。 以下のクリスの応答 を参照してください。ただし、変数が「ソース環境」に存在せず、新しく作成された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に「update-environmentコマンド」を追加する必要さえないと思います。 man page によると、SSH_AUTH_SOCKはデフォルトですでにカバーされています。

クレジット

私の応答は このブログ投稿 の抜粋です screen について同じ問題を説明するMark 'xb95' Smithによる。

36
djf

Tmuxを使用してssh-agentを処理する代わりに、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 に入れています。

2
demure

StackOverflowで同様の質問に回答しました https://stackoverflow.com/a/49395839/241025 。このページはGoogle検索で最初に表示されたので、ここに要約バージョンを投稿したいと思いました。

各tmuxセッションに一連のカスタム環境変数を持たせるには、tmuxのセッションごとの環境変数に値を追加する必要があります。これを行う方法の例を次に示します。

tmux new-session -s one
tmux setenv FOO foo-one
export FOO='foo-one'

現在のペインが環境変数を取得できるように、FOOを明示的にエクスポートする最後の手順が必要です。このtmuxセッション用に作成する後続のペインまたはウィンドウはFOOを継承しますが、他のセッションでは表示されません。

1
RobotNerd

dJFの説明は私の心に別の可能な解決策をもたらします:

tmux/screenが実行される前:

  1. ログインする。
  2. ssh-agentのインスタンスを起動します。
  3. このssh-agentの環境変数を使用して、tmux/screenを開始します。

これはクライアントへのSSH転送を使用できませんでしたが、要求されませんでした。

0
Hauke Laging