Shell

為什麼我重新附加時必須在 tmux 中重新設置環境變數?

  • July 20, 2018

我主要在 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 視窗。我寧願不必這樣做。有任何想法嗎?

更新

我想我沒有很好地解釋這一點。這是我在遠端機器上打開 shell 的 shell 函式:

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

當 tmux 執行這個 ssh 命令時,$SSH_AUTH_SOCK沒有設置,即使它在我的本地環境中設置的。如果我用上面的命令把它放在 tmux 的環境中setenv,一切正常。我的問題是,為什麼我必須執行 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_AUTH_SOCKupdate-environment. 因為它在那個列表中,所以每次我重新附加時,價值都會被吹走。感謝@djf 提供線索。該部分中 tmux(1) 手冊頁的顯著update-environment部分:

源環境中不存在的任何變數都被設置為從會話環境中刪除(就像將 -r 賦予 set-environment 命令一樣)。

自從我收到賞金後,為了完整起見,我將重新發布我的關鍵評論 - 並避免將具有相同問題的訪問者置於錯誤的軌道上:

Tmux 將刪除環境變數

Tmux 的手冊頁指出 update-environment 將刪除*“源環境中不存在的變數”$$ … $$好像 -r 被賦予了 set-environment 命令”。*

顯然,是什麼導致了這個問題。請參閱下面 Chris 的回复。但是,我仍然無法想像變數如何在“源環境”中不存在,但在新創建的 tmux 視窗中仍然有效……


上一個答案:

SSH 轉發的工作原理

在遠端機器上,在建立 SSH 連接後看看你的 shell 的環境:

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 中添加“更新環境命令”。根據手冊頁,預設情況下已經涵蓋了 SSH_AUTH_SOCK。

信用

我的回復是 Mark ‘xb95’ Smith 的這篇部落格文章的摘錄,他解釋了screen的相同問題。

引用自:https://unix.stackexchange.com/questions/75681