在另一个tmux会话中打开一个tmux会话时如何发送命令?


136

典型的情况可能是:

$ tmux
  [0] $ ssh example.com
      $ tmux attach
        [0] $ 

我打开一个tmux会话,然后SSH到服务器并附加到现有的tmux会话。此时,我在另一个内部进行了一个tmux会话。如何将命令发送到内部tmux会话?

注意:两个tmux会话都具有相同的键绑定。


4
不是编程问题。请尝试superuser.com。祝好运。
剥壳机2011年

1
我很乐意提出要解决的问题,但是对于上下文,我在tmux内使用vim进行编码,当然,经常必须将ssh插入发生此问题的其他服务器。
克里斯(Kris)

Answers:


207

send-prefix命令可用于将前缀击键发送到活动窗格(正在其中运行的进程)。默认情况下,前缀为Cb且绑定了Cbsend-prefix(因此,将其击中两次会将单个Cb发送到活动窗格)。这正是我们访问内部tmux实例的绑定所需要的。

第一个Cb被“外部” tmux实例捕获为其前缀键。第二个被“外部” tmux实例捕获,并触发其Cb绑定(send-prefix)。这会将Cb发送到外部实例的活动窗格。在此窗格中运行的进程(最终通过ssh实例)是“内部” tmux实例。它捕获Cb作为其前缀密钥。现在,您的下一个击键将通过外部tmux实例,并被内部tmux实例捕获以触发绑定。

要在第二级tmux实例中触发c绑定(new-window),请键入Cb Cb c。对于tmux的第三级实例,您可以输入Cb Cb Cb Cb c

如果您通常要处理多层tmux,则每个级别的倍增都会很烦人。如果可以保留一些其他键,则可以进行非前缀绑定,以使事情(可能)更容易键入:

bind-key -n C-\ send-prefix
bind-key -n C-^ send-prefix \; send-prefix

在第二级tmux中 创建新窗口:C- \ c
在第三级tmux中创建新窗口:C- ^ c(或C- \ C- \ c


如果您想要(轻松)发送给较低级tmux实例的tmux命令数量有限,则可以改用创建一些特定的绑定(可能只是在顶级tmux实例中):send-keys

bind-key C-c  send-keys C-b c
bind-key C    send-keys C-b C-b c

创建第二级新窗口TMUX的Cb抄送
创建三级新窗口TMUX的CbÇ


另外,我必须注释掉我last-window在执行操作时调用的现有绑定C-a C-a,例如:#bind-key C-a last-window。请注意,我的前缀a不是默认前缀b
克里斯(Kris)

1
bind-key -n C-\ send-prefix不起作用。我的tmux无法识别\。当我使用字母时,它可以工作。
darksky 2013年

@Darksky:您正在使用哪个版本的tmux?它适用于我1.7、1.6和1.5。如果要通过shell命令(例如tmux bind-key -n 'C-\' send-prefix)进行绑定,则肯定需要添加额外的引用级别。如果您在使用它~/.tmux.conf(或Prefix :命令行)时遇到问题,则可以尝试使用类似的引号(即bind-key -n 'C-\' send-prefix)。
克里斯·约翰森


7

编辑:

建议将其C-q用作绑定键,因为它是默认的控制键命令

解冻屏幕,让屏幕继续显示

这里发生一种情况,@Paschalis提供了一个解决方案:

如果碰巧是两次不幸(以Cq为前缀的远程tmux会话):键入Cltr-q,然后:输入,然后输入tmux:send-keys C-q

下面是答案:


为了简单起见,请在您的 ~/.tmux.conf

bind-key -n C-q send-prefix

然后,您可以直接将其C-q用作远程tmux的绑定键。


如果有人更改了外部tmux中的默认活页夹密钥,则必须使用内部tmux中的相同默认活页夹密钥,以上代码段才能正常工作!
Paschalis

我正在修改本地tmux的前缀(在我的情况下为Ctrl +]),因此服务器上的所有“内部” tmux-es均具有默认绑定前缀
无效
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.