为什么我重新附加时必须在 tmux 中重新设置环境变量?

Chr*_* W. 45 shell tmux environment-variables

我主要在 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
Run Code Online (Sandbox Code Playgroud)

为了$SSH_AUTH_SOCK正确设置新的 tmux 窗口。我宁愿不必这样做。有任何想法吗?

更新

我想我没有很好地解释这一点。这是我在远程机器上打开 shell 的 shell 函数:

sshh () {
    tmux -u neww -n ${host} "ssh -Xt ${host} $*"
}
Run Code Online (Sandbox Code Playgroud)

当TMUX运行此ssh命令,$SSH_AUTH_SOCK没有设置,即使在我的本地环境设置。如果我使用setenv上面的命令将其放入 tmux 的环境中,则一切正常。我的问题是,为什么我必须运行 setenv 命令?

更新 2

更多信息:

当我附加到现有会话时,$SSH_AUTH_SOCK未在 tmux 环境(或全局环境)中设置。

% tmux showenv | grep -i auth_sock
-SSH_AUTH_SOCK
Run Code Online (Sandbox Code Playgroud)

如果我手动设置它,事情会起作用:

% tmux setenv SSH_AUTH_SOCK $SSH_AUTH_SOCK
Run Code Online (Sandbox Code Playgroud)

如果我分离并重新连接,$SSH_AUTH_SOCK则会回到未设置状态。

djf*_*djf 41

自从我收到赏金以来,为了完整起见,我将重新发布我的关键评论 - 并避免将遇到相同问题的访问者置于错误的轨道上:

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
Run Code Online (Sandbox Code Playgroud)

这里重要的一个是 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
Run Code Online (Sandbox Code Playgroud)

我认为您甚至不必在 tmux.conf 中放置“更新环境命令”。根据手册页,SSH_AUTH_SOCK 已经默认覆盖。

信用

我的回答是Mark 'xb95' Smith的这篇博文的摘录,他解释了screen的相同问题。


Chr*_* W. 14

我想通了。简短的回答,我需要SSH_AUTH_SOCKupdate-environment. 由于它在该列表中,因此每次我重新附加时,价值都会被吹走。感谢@djf 提供线索。部分中 tmux(1) 手册页的突出update-environment部分:

源环境中不存在的任何变量都设置为从会话环境中删除(就像将 -r 赋予 set-environment 命令一样)。