一、介绍
Tmux 是一种终端多路复用器。它允许您从一个 tmux 会话同时运行和管理多个命令提示符。
Tmux 使用客户端/服务器模型,该模型允许它保持连接。您可以从一台计算机启动会话,运行其中运行的多个程序,然后断开连接。您可以稍后从另一台计算机重新连接到同一会话,并且相同的程序将运行。
二、在 Debian 和 Ubuntu 上安装 tmux
在 Debian 和 Ubuntu 系统上,使用 apt 安装 tmux。
$ sudo apt-get update && sudo apt-get -y install tmux
三、在 Redhat,CentOS 和其他基于RHEL 的发行版上安装 tmux
在 Redhat,CentOS 和其他基于 RHEL 的系统上,使用 yum 安装 tmux。
$ sudo yum install update && sudo yum -y install tmux
四、术语
- 窗格 – 窗格只是终端提示符。
- 窗口 – 一个窗口在一个屏幕上包含多个窗格(终端)。
- 会话 – 一个会话有多个窗口。
- 服务器 – 服务器保存多个会话。它在后台运行,并确保会话的持久性。
五、启动新的 tmux 会话
$ tmux new -s start
您将在屏幕底部看到一个栏,其中创建了会话名称 tmux,开始,在括号中。这是因为 tmux 在创建新窗格时会自动使用您的用户帐户登录。
六、在 tmux 中操纵
进入 tmux 会话后,您可以使用前缀键触发命令以告诉 tmux 要做什么。默认前缀键为 + 。例如,如果要告诉 tmux 通过将屏幕拆分为两个垂直部分来创建新窗格,请先键入 + ,然后键入 。CTRLBCTRLB%
七、创建多个窗格
如果您键入 + ,则如上所示,则屏幕上有两个窗格。CTRLB%
- 通过键入 + 将当前窗格拆分为两个水平部分,然后键入 。CTRLB"
- 要循环浏览所有三个窗格,请键入 + ,然后键入 。CTRLBO
八、在窗格之间切换
若要在不同的打开窗格之间切换,请使用带有前缀的箭头键。
- CTRL + B,然后:转到当前窗格上方的窗格。UP
- CTRL + B,然后 :转到当前窗格下方的窗格。DOWN
- CTRL + B,然后 :转到当前窗格左侧的窗格。LEFT
- CTRL + B,然后 :转到当前窗格右侧的窗格。RIGHT
九、创建多个窗口
- 在启动会话中创建新窗口。键入 + ,然后打开一个新的空白终端。CTRLBC
- 将此终端拆分为两个水平窗格,其中 + ,然后 。CTRLB"
- 使用 + 创建第三个窗口,然后 。CTRLBC
您将再次看到一个新的空白终端。
- 发出命令,然后按以确认已打开三个窗口。
tmux list-windows
ENTER - 使用 + ,然后在创建的三个窗口之间循环。CTRLBN
十、附加和分离到会话/从会话分离
- 使用 + ,然后从当前会话分离。CTRLBD
- 使用 重新连接到会话。
tmux attach -t YOUR_SESSION_NAME
- 使用 + ,然后在会话中的窗口之间循环。CTRLBN
十一、通用键绑定
- CTRL + B,然后:创建新窗口。C
- CTRL + B,然后 :重命名窗口。,
- CTRL + B,然后 :移动到下一个窗口。N
- CTRL + B,然后 :移动到上一个窗口。P
- CTRL + B,然后:终止当前窗口。&
- CTRL + B,然后:将当前窗格拆分为两个(垂直)。%
- CTRL + B,然后:将当前窗格拆分为两个(水平)。"
- CTRL + B,然后:切换到下一个窗格。O
- CTRL + B,然后:显示窗格编号(然后键入 # 切换到它)。Q
- CTRL + B,然后:从当前会话分离。D
- CTRL + B,然后 :列出所有键绑定。?
- CTRL + B,然后:杀死活动窗格(按下确认后)。XY
- CTRL + B,然后 :显示所有活动窗口和窗格的概述。使用箭头键在窗口列表中移动并查看所选窗口的预览。按下可切换到所选窗口。按下可退出概览。WENTERESC
11.1、常用命令
tmux list-sessions
– 列出现有的 tmux 会话。tmux new -s session-name
– 创建一个名为会话名称的新 tmux 会话。tmux attach -t session-name
– 连接到名为会话名称的现有 tmux 会话。tmux switch -t session-name
– 切换到名为会话名称的现有 tmux 会话。
11.2、使用 Vim 键绑定在窗格之间切换
您可以使用 Vim 键 、、、 .为此,请更新 tmux 配置文件 。如果此文件不存在,请创建它。HJKL~/.tmux.conf
将这些行(第一行是注释)添加到配置文件中,以使用 Vim 键启用窗格导航:
# hjkl pane traversal
bind h select-pane -L
bind j select-pane -D
bind k select-pane -U
bind l select-pane -R
更新配置文件后,重新启动 tmux。您可以通过获取更新的配置文件来加载新配置而无需重新启动 tmux:
tmux source-file ~/.tmux.conf
十二、元键
以下部分中的许多键绑定都基于 Meta 键。在大多数现代计算机和键盘上,元键不是一个特定的键。根据系统设置和正在使用的终端仿真器,Meta 键可以绑定到 、 或 。在看到键绑定的一部分时,请尝试使用该键。如果不起作用,请尝试上述其他键之一。ESCALTCOMMANDWINOpt
METAESC
十三、调整窗格大小
当窗口有多个窗格时,可以更改各个窗格的大小。
- 要更改窗格大小,请按住前缀 (+),同时按其中一个箭头键。CTRLB
- 按住 + ,同时按 或 : 更改窗格的高度。CTRLBUPDOWN
- 按住 + ,同时按 或 : 更改窗格的宽度。CTRLBLEFTRIGHT
上述组合键“连续”调整窗格的大小,只要按住它们。要一步一步地调整窗格的大小,请执行以下操作:
- CTRL + B,然后 + 或 :更改窗格的高度。METAUPDOWN
- CTRL + B,然后 + 或 :更改窗格的宽度。METALEFTRIGHT
特定组合键(如上)是增加还是减少窗格的尺寸取决于该窗格相对于其他窗格的位置。
如果终端模拟器支持使用鼠标,则可以通过拖动窗格边框来调整窗格的大小。
十四、选择预设窗格布局
Tmux 有五种不同的预设布局,用于在窗口中排列多个窗格:
- 所有窗格并排堆叠。
- 所有窗格都堆叠在一起。
- 主窗格占据整个屏幕宽度,其他窗格并排堆叠在其下方
- 主窗格占据整个屏幕高度,其他窗格堆叠在它旁边,彼此重叠
- 所有窗格都排列在一个网格中。
启动 tmux 并创建 4 个(或任意数量的)窗格。
要循环浏览不同的预设布局,请使用 + ,然后CTRLBSPACE
您还可以选择特定布局:
- CTRL + B,然后 + :切换到布局 1。META1
- CTRL + B,然后 + :切换到布局 2。META2
- CTRL + B,然后 + :切换到布局 3。META3
- CTRL + B,然后 + :切换到布局 4。META4
- CTRL + B,然后 + :切换到布局 5。META5
十五、交换窗格位置
当窗口具有多个窗格时,您可以移动窗格并交换其位置。
注意:如前所述,+ ,然后使光标在不同的窗格中循环。上面的顺序用于循环窗格本身的位置。CTRLBO
- CTRL + B,然后 + 顺时针循环窗格的位置。METAO
- CTRL + B,然后 + 逆时针循环窗格的位置。CTRLO
十六、分离并重新连接单个窗格
在窗口中具有多个窗格的布局中,有时需要将窗格移动到其他位置。交换窗格位置(如上所述)并不总是足够的,因为它会干扰所有其他窗格的位置。有时还需要将窗格移动到同一会话中的其他窗口。
使用 tmux 命令提示符中的命令将窗格与窗口分离。 重新附加窗格。break-pane
join-pane
要访问 tmux 命令提示符,请按前缀 + ,然后按 。这将在终端底部打开一个提示。要在不输入任何命令的情况下退出它,请按 + 。CTRLB:CTRLC
要分离窗格,请切换到要分离的窗格,激活 tmux 命令提示符( + , then ),然后输入命令:CTRLB:
break-pane -dP
这将分离活动窗格并显示其“ID”。此 ID 的格式为 X、Y 和 Z 为数字。上一个窗格将成为新的活动窗格。该 ID 显示在(新的)活动窗格的顶部。记下此 ID,然后按 将其关闭。X:Y.Z
ESC
分离的窗格可以重新附加到同一会话中任何窗口中的任何窗格旁边。切换到要重新附加分离窗格旁边的窗格。激活 tmux 命令提示符并输入:
join-pane -vs X:Y.Z
这会将分离的窗格重新附加到活动窗格下方(代表垂直拆分)。要在活动窗格的右侧重新连接分离的窗格:vs
join-pane -hs X:Y.Z
在上面的命令中,代表水平拆分。hs
十七、在用户之间共享 tmux 会话
17.1、会话的工作原理
启动 tmux 时,它会创建一个新的服务器实例并在该服务器内创建会话。
Tmux 客户端和服务器是单独的进程。它们通过 UNIX 套接字进行通信。默认情况下,tmux 将套接字存储在目录中。由单个用户创建的服务器的套接字存储在名为“其中是该用户的 UNIX UID”的子目录下。用户为 1001 的套接字将存储在 中。此子目录的所有者是 。默认情况下,其他用户或组无法访问此子目录。/tmp
tmux-UID
UID
UID
/tmp/tmux-1001
user1
17.2、兼容性
本节中描述的步骤已在 tmux 版本 3.1 和 3.3 上在原版 Debian 11 安装上进行了测试。它们应该适用于所有最新的 tmux 版本。
注意:在安全强化的操作系统(例如涉及 SELinux 的操作系统)上,更改组和权限可能需要额外的步骤。讨论这些超出了本指南的范围。假设您知道如何更改操作系统上的组和权限。
Tmux 版本 3.3(于 2022 年 6 月发布)在会话共享的工作方式中引入了与安全相关的更改。这些更改涉及使用新添加的命令。使用 检查 tmux 安装的版本。实际上,这会导致 tmux 版本 3.3 及更高版本的额外步骤。server-access
tmux -V
17.3、系统说明
考虑一个具有两个用户的系统:使用 UID 1001 和 UID 1002。user1
user2
为了连接到 创建的 tmux 会话,) 必须有权访问 创建的服务器的套接字,以便 创建的客户端可以与 创建的服务器通信,并且(对于版本 3.3 及更高版本)可以访问 通过命令授予的服务器。user2
user1
user2
user1
user2
user1
user1
server-access
在执行以下步骤时,请根据您自己的系统使用适当的用户 ID 和用户名。检查用户的 UID(和其他详细信息):user1
$ id user1
不带任何参数的命令显示当前用户的 UID(和其他详细信息)。id
如果系统上没有其他用户帐户,请在测试这些步骤之前创建新用户。
17.4、步骤
以下步骤描述了如何向 授予对其 tmux 会话的访问权限。user1
user2
- 在终端会话中,以 身份登录。
user1
- 启动 tmux 会话:
$ tmux
这将创建套接字(子)目录(如果它以前不存在)。
- 检查套接字目录的所有权和权限:
$ ls -hdl /tmp/tmux-1001
- 为 和 创建一个公共组,这样可以更轻松地管理权限。创建一个新组:
user1
user2
tmuxusers
# groupadd tmuxusers
- 添加并添加到此组:
user1
user2
# usermod -a -G tmuxusers user1 # usermod -a -G tmuxusers user2
- 将目录组更改为 :
/tmp/tmux-1001
tmuxusers
# chgrp -R tmuxusers /tmp/tmux-1001
user2
需要完全访问 启动的 TMUX 服务器的套接字。授予组对目录的完全权限:user1
# chmod -R g+rwx /tmp/tmux-1001
- 验证目录的组是否已更改为,并且该组是否对该目录具有完全权限:
tmuxusers
$ ls -hdl /tmp/tmux-1001
- 退出正在运行的 tmux 会话:
$ exit
- 作为(再次),创建一个新的 tmux 会话并指定套接字的名称:
user1
$ tmux -L socket1
- 该选项创建一个命名套接字,路径为 。
-L
socket1
/tmp/tmux-1001/socket1
- 到目前为止,所有命令都适用于所有最新版本的 tmux。接下来的 3 个命令仅适用于 tmux 版本 3.3 及更高版本。
- 在新创建的 tmux 会话中,授予对 tmux 服务器的访问权限:
user2
$ tmux server-access -w -a user2
- 上述命令提供对会话的写入访问权限。因此,也可以在会话中输入命令。可以只授予读取访问权限。具有读取访问权限,只能查看会话的内容,但不能输入任何命令。要授予读取访问权限,请使用而不是在上面的命令中:
user2
user2
user2
user2
user2
-r
-w
$ tmux server-access -r -a user2
user1
可以撤销授予以下权限:user2
$ tmux server-access -d user2
前三个命令仅适用于 tmux 版本 3.3 及更高版本。进一步的步骤适用于所有最新版本的 tmux。
- 在新创建的 tmux 会话中,授予对 tmux 服务器的访问权限:
- 更改新套接字文件的组:
# chgrp tmuxusers /tmp/tmux-1001/socket1
- 验证套接字文件的组是否为,以及该组是否有权访问该文件:
tmuxusers
# ls -l /tmp/tmux-1001/socket1
- 检查打开的会话的 ID:
$ tmux ls
- 在另一个终端中,以 身份登录。启动 tmux 并指定由 创建的命名套接字的路径:
user2
user1
$ tmux -S /tmp/tmux-1001/socket1 ls
上面的命令显示了服务器上由 启动和侦听的会话列表。
user1
socket1
- 附加到会话:
$ tmux -S /tmp/tmux-1001/socket1
- 如果有许多打开的会话,请附加到特定会话(其 ID 为 N):
$ tmux -S /tmp/tmux-1001/socket1 attach -t N
user2
现在已连接到 的 TMUX 会话。user1
十八、使用嵌套会话
通常,在 tmux 中使用嵌套会话既不是必需的,也不建议使用。但是,当从本地 tmux 会话中连接到远程 tmux 会话时,它很有用。假设您处于本地计算机上的 tmux 会话中。在其中一个窗格(或窗口)中,登录到也具有正在运行的 tmux 会话的远程服务器。当您连接到此远程服务器上的 tmux 会话时,最终会得到嵌套会话。远程 tmux 会话嵌套在本地 tmux 会话中。
要将按键序列传递到嵌套会话,请连续按两个会话的前缀组合键。假设两个会话都使用默认前缀键,请按两次 + 访问嵌套会话。CTRLB
例如,要在嵌套会话中执行垂直拆分,请输入 +,后跟 (再次)、+,然后输入 。CTRLBCTRLB%