本地和远程服务器上的嵌套 tmux 会话

Nested tmux sessions on local and remote servers

我正在尝试将 tmux 设置为像这样工作:

因此每个内部会话都直接嵌套在外部会话中。

如果我这样设置 .tmux.conf

unbind C-b
set -g prefix C-a
bind-key -n C-b send-prefix

本地内部会话正确接收 C-b 前缀,但远程内部会话没有。

如果我将 tmux.conf 更改为:

unbind C-b
set -g prefix C-a

然后远程内部会话收到 C-b,但本地会话没有。

有没有一种方法可以配置 tmux,使本地和远程嵌套会话都收到 C-b 前缀?

tmux 手册说,如果我没看错的话,1) 前缀是服务器级别的设置,2) 所有会话都由单个服务器管理。这意味着您无法在具有不同前缀的同一主机上获得外部和内部会话,除非您使用相应的选项作为非默认套接字和第二个服务器的另一个配置来启动多个服务器。

或者,使用 GNU screen 比使用 tmux 更容易。它允许在命令行中指定前缀并以更简单的方式实现无限的服务器数量。

更新[2017-07-05]:现代 tmux 有足够的每会话配置,包括开关前缀,尽管有些麻烦。

this blog post 关于 Tmux 脚本的启发,我找到了解决方案。我把它放在本地主机上的 shell 启动脚本(例如 .bashrc)中:

tmux_outer() {
  SESSION=
  tmux -2 new-session -d -s $SESSION
  tmux set prefix C-a
  tmux -2 attach-session -t $SESSION
}

tmux_inner() {
  SESSION=
  env TMUX='' tmux -2 new-session -s $SESSION
}

并删除了我的 .tmux.conf

我原来的问题.tmux.conf:

unbind C-b
set -g prefix C-a
bind-key -n C-b send-prefix

好像是set -g prefix C-a,全局设置前缀为C-a。在我的 shell 函数中,我创建了处于分离状态的外部会话,仅针对该会话将前缀设置为 C-a,然后附加到该会话。

当我在本地主机或远程主机上启动内部会话时,它具有默认的 tmux 前缀 C-b。由于外部会话没有尝试捕获和发送 C-b,因此两个内部会话都可以毫无问题地接收 C-b