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 命令?
更多信息:
当我附加到现有会话时,$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 的手册页指出,update-environment 将删除“源环境中不存在的变量[...],就像将 -r 赋予 set-environment 命令一样”。
显然是什么导致了这个问题。请参阅下面的 Chris 回复。但是,我仍然无法想象变量如何在“源环境”中不存在而在新创建的 tmux 窗口中仍然有效......
上一个答案:
在远程机器上,在建立 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_SOCK
从update-environment
. 由于它在该列表中,因此每次我重新附加时,价值都会被吹走。感谢@djf 提供线索。部分中 tmux(1) 手册页的突出update-environment
部分:
源环境中不存在的任何变量都设置为从会话环境中删除(就像将 -r 赋予 set-environment 命令一样)。