如何在连接时将环境变量从当前连接的客户端传递到 tmux 会话

如何在连接时将环境变量从当前连接的客户端传递到 tmux 会话

我经常(主要是)在纯文本 SSH pty 中远程工作时使用 tmux;万一连接断开,它非常有用。我运行长时间(数小时到数天)的计算任务,并从不同的远程主机连接以检查它。这几乎是我用 tmux 做的唯一事情;我远非专业人士,所以我的问题可能非常简单,但我找不到答案。

我在主机上有一个命令,它从 shell 变量中读取并解析出客户端地址,$SSH_CONNECTION以某种方式与我当前客户端计算机上的守护程序进行通信(直接,没有 ssh 隧道)。当我附加到最初在另一台计算机上启动的会话时,这会在 tmux 下中断。 tmux 会话中最底层的 shell 已经在启动时捕获了该变量,并且具有客户端计算机的地址发起会议,而不是会议本身目前已连接到它。

一个简单的解决方案是在 my 中完全重置此变量.bashrc,因此该工具甚至不会尝试与 tmux 会话内的客户端连接进行通信(毕竟,如果它失败,我可以在其命令行中为该工具提供一个 IP猜一个)。我相信我可以依靠 env 变量的存在$TMUX来避免在 .bashrc 中完全捕获 IP 地址。

但正确的做法是以某种方式从我执行tmux attach命令的 bash 中提升这个变量。我知道它不能完全自动,因为远程上的 tmux 可能无法修改已经运行的第一个 shell 的环境。但也许我可以使用一些奇特的 tmux 脚本从tmux运行命令的进程中提取环境变量attach(附加的 SSH 会话机器已在其环境中正确设置它们),将值存储在会话 tmux 变量中的某个位置(它们是否存在) ?),并让我export SSH_SESSION=....在知道安全时(即在会话内的 bash 提示符上)通过击键运行自定义命令来取消获取(即假键入会话的 bash )?

长话短说:我想要一种方法在我附加的会话中设置环境变量,该会话基于另一个 pty 连接中的环境变量值,在该连接中我tmux attach以最不麻烦的方式运行命令,就像熟练的 tmuxer 一样。


1 这不是一个好的或安全的方法,但事实就是如此。我们必须在科学计算中使用很多奇怪的东西,这些东西是由科学家同行编写的,他们现在或其中一些已经是,就像本例一样,不一定是优秀的软件工程师。在本世纪我会采取不同的做法,但这件事已经有30年历史了。

答案1

SSH_CONNECTION 默认处于更新环境中,因此它将在附加时在会话环境中更新,然后您可以将其复制到 tmux 内正在运行的 shell,如下所示:

eval $(tmux showenv -s SSH_CONNECTION)

相关内容