再アタッチするときにtmuxでenv変数を再設定する必要があるのはなぜですか?


37

私は主に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されないことがあっても、設定された私のローカル環境で設定してください。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設定されていない状態に戻ります。


これはSSHに関するものではありませんか?新しいシェルにはどの環境変数がありますenvか?
ホークレイジング

Macで使用しているシェルは何ですか?バッシュ?
slm

@HaukeLagingそれは本当にtmuxについてです。
クリスW.

@slm私はzshを使用しています。
クリスW.

既存のウィンドウはどうですか?彼らはまだ働いていますか?
ハウケレイジング

回答:


35

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

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

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

どうやら問題の原因と思われる。以下の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

ここで重要なのはSSH / AUTH_SOCKで、現在/ tmpのファイルに設定されています。このファイルを調べると、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コマンド」を入れる必要さえないと思います。マニュアルページによると、SSH_AUTH_SOCKはデフォルトですでにカバーされています。

クレジット

私の応答はの抜粋です。このブログの記事のために同じ問題を説明し、マーク「xb95」スミス画面


あなたの思慮深い対応に感謝します。私の質問は$SSH_AUTH_SOCK、新しいシェルに設定することではなく、$SSH_AUTH_SOCK.bashrc / .zshrcを入手する前に新しいtmuxウィンドウに設定することです。
クリスW.

@ChrisW。スクリプトは、リモートマシンのログインシェルのrcファイルに配置する必要があると想定しました。ログインすると、新しいシェルが生成され、SSH_AUTH_SOCKが変更されてエクスポートされます。tmuxを起動すると、親環境からSSH_AUTH_SOCKを継承します。SSH_AUTH_SOCKの値が修正されたため、tmuxは後続のログインで動作し続けるはずです...多分私は問題を誤解していたのかもしれません
-djf

私の混乱は、新しいウィンドウのコンテキストでtmuxがsshを実行する環境(例tmux neww ssh somehost)についてだと思います。
クリスW.

このアプローチの問題の1つは、マシンへの2番目のSSH接続がの値を上書きすることですSSH_AUTH_SOCK。このアプローチは、最新のSSH接続を介してtmuxセッションが開いているときにのみ機能します。
ファイラ

12

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

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


1
@ChrisW。もう少しはっきりさせていただけますか?私は同じ問題を抱えていると思います:tmuxセッションを再接続すると、エージェントが動作しなくなることがあります。SSH接続は新しいものであり、sshで新しいエージェントが開始されるため、ある程度意味があります。動作させるには何を変更する必要がありますか?ssh-ingしている各マシンを再構成する必要がないので、実行できるものであることを願っています。-tmuxをリモートで起動するか、既存の接続を復元するsshラッパーがあります。おそらく、tmuxを復元する前に何かを行うことができます。
ソリン14年

@ChrisW。短い回答がいい場合もありますが、長い回答をお願いします。私はこれを機能させるのに苦労しており、この投稿には何も機能していません。
redbmk

@sorin @redbmk申し訳ありません。これは、.tmux.confこれを機能させるため に変更しなければならなかった唯一の行です。一般的な環境変数や環境変数にset -g update-environment "SSH_ASKPASS WINDOWID SSH_CONNECTION XAUTHORITY" 問題がありますsshか?
クリスW.

2

tmshを使用して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にこれがあります。


$SSH_AUTH_SOCKはシェルで適切に設定されていますがtmux neww ssh somehost、などの操作を行うと、を実行しない限り、秘密鍵のロックを解除するためのパスフレーズを要求されますtmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK
クリスW.

1

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を継承しますが、他のセッションでは表示されません。


0

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

tmux/ screenが実行される前:

  1. ログイン。
  2. のインスタンスを開始しますssh-agent
  3. これの環境変数でtmux/ screenを開始しますssh-agent

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


1
ssh-agentはTTYにバインドしません、なぜlogout(?)で殺されるべきnohupですか?
poige

@poige正しい。
ハウケレイジング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.