為什麼我重新附加時必須在 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 視窗。我寧願不必這樣做。有任何想法嗎?更新
我想我沒有很好地解釋這一點。這是我在遠端機器上打開 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_SOCK
從update-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。
信用