VPS推荐

2023年Tmux使用教程完整版

Pinterest LinkedIn Tumblr

Tmux是一个终端复用器。它允许您从一个tmux会话中同时运行和管理多个命令提示符。Tmux使用客户端/服务器模型,这使它能够保持连接。您可以从一个计算机开始会话,在其中运行多个程序,然后断开连接。您可以稍后从另一台计算机重新连接到同一会话,同一程序将在运行。管理搬瓦工Vultr等VPS云主机,本文整理了Tmux使用教程,例如将运行的命令或任务放置后台运行,并且还可以恢复session会话。

在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使用教程完整版

术语

  • Pane – Pane就是一个终端提示符。
  • Window – Window可以在一个屏幕上容纳多个Pane(终端)。
  • Session – Session包含多个Window。
  • Server – Server包含多个Session。它在后台运行,确保Session的持久性。

Tmux使用教程完整版

Tmux使用教程完整版
Tmux

开始新的tmux会话

$ tmux new -s start

您将在屏幕底部看到一个带有会话名称tmux创建的条目,start在方括号中。这是因为tmux在创建新的Pane时会自动使用您的用户帐户登录。

在tmux中的操作

一旦进入tmux会话,您可以使用前缀键触发命令告诉tmux要做什么。默认前缀键是CTRL + B。例如,如果要告诉tmux通过将屏幕分为两个垂直部分来创建一个新的Pane,您首先要键入CTRL + B,然后是%。

创建多个Pane

如果您像上面一样键入CTRL + B,然后是%,那么您的屏幕上就有两个Pane。

  • 通过键入CTRL + B,然后是”,将当前Pane分成两个水平部分。
  • 要在所有三个Pane之间循环,键入CTRL + B,然后是O。

在Pane之间切换

要在不同的打开的Pane之间切换,使用带前缀的箭头键。

  • CTRL + B,然后UP:转到当前面板上方的面板。
  • CTRL + B,然后DOWN:转到当前面板下方的面板。
  • CTRL + B,然后LEFT:转到当前面板左侧的面板。
  • CTRL + B,然后RIGHT:转到当前面板右侧的面板。

创建多个Window

  1. start会话中创建一个新的Window。键入CTRL + B,然后C打开一个新的空终端。
  2. 通过CTRL + B,然后”将此终端分成两个水平Pane。
  3. 使用CTRL + B,然后C创建第三个Window。

您将再次看到一个新的空终端。

  1. 发出命令“tmux list-windows”,然后按ENTER键确认您已打开三个窗口。
  2. 使用CTRL + B,然后N在创建的三个窗口之间循环。

连接和断开与会话

  • 使用CTRL + B,然后D从当前会话中分离。
  • 使用tmux attach -t YOUR_SESSION_NAME重新连接到会话。
  • 使用CTRL + B,然后N在会话中循环所有窗口。

常用键绑定

  • CTRL + B,然后C:创建新窗口。
  • CTRL + B,然后,:重命名窗口。
  • CTRL + B,然后N:移动到下一个窗口。
  • CTRL + B,然后P:移动到上一个窗口。
  • CTRL + B,然后&:删除当前窗口。
  • CTRL + B,然后%:将当前Pane分成两个(垂直)。
  • CTRL + B,然后”:将当前Pane分成两个(水平)。
  • CTRL + B,然后O:切换到下一个Pane。
  • CTRL + B,然后Q:显示Pane编号(然后键入#切换到它)。
  • CTRL + B,然后D:从当前会话中分离。
  • CTRL + B,然后?:列出所有键绑定。
  • CTRL + B,然后X:删除活动Pane(按Y确认后)。
  • CTRL + B,然后W:显示所有活动窗口和Pane的概述。使用箭头键在窗口列表中移动并查看所选窗口的预览。按ENTER键切换到所选窗口。按ESC键退出概述。

常用命令

  • tmux list-sessions – 列出现有的tmux会话。
  • tmux new -s session-name – 创建一个名为session-name的新tmux会话。
  • tmux attach -t session-name – 连接到名为session-name的现有tmux会话。
  • tmux switch -t session-name – 切换到名为session-name的现有tmux会话。

使用Vim键绑定在Pane之间切换

您可以使用Vim键H、J、K、L而不是使用箭头键在不同的Pane之间切换。要执行此操作,请更新tmux配置文件~/.tmux.conf。如果不存在此文件,请创建它。

将以下行(第一行是注释)添加到配置文件中以启用使用Vim键进行Pane导航:

# hjkl pane traversal

bind h select-pane -L

bind j select-pane -D

bind k select-pane -U

bind l select-pane -R

更新配置文件后,重新启动tmux即可。您可以通过sourcing更新的配置文件而无需重新启动tmux来加载新的配置文件:

tmux source-file ~/.tmux.conf

元键

以下各节中的许多键绑定都基于元键。在大多数现代计算机和键盘上,元键不是一个特定的键。根据系统设置和使用的终端模拟器,元键可以绑定到ESC、ALT、COMMAND、WIN或Opt之一。在键绑定中看到META作为一部分时,请尝试使用ESC键。如果不起作用,请尝试使用上面提到的其他键之一。

如何调整Tmux的Panel

调整Pane的大小

当一个窗口有多个Pane时,您可以更改单个Pane的大小。

  • 要更改Pane的大小,请按住前缀键(CTRL + B),并同时按下箭头键之一。
  • 按住CTRL + B,然后同时按下UP或DOWN:更改Pane的高度。
  • 按住CTRL + B,然后同时按下LEFT或RIGHT:更改Pane的宽度。

上述键组合按下时,将“连续”调整Pane的大小。要一次一步地调整Pane的大小:

  • CTRL + B,然后META + UP或DOWN:更改Pane的高度。
  • CTRL + B,然后META + LEFT或RIGHT:更改Pane的宽度。

特定键组合(如上)增加还是减少Pane的尺寸取决于该Pane相对于其他Pane的位置。

如果终端模拟器支持使用鼠标,则可以通过拖动其边框来调整Pane的大小。

选择预设Pane布局

Tmux有五种不同的预设布局,用于在窗口中排列多个Pane:

  1. 所有Pane都并排堆叠在一起。
  2. 所有Pane都堆叠在彼此之上。
  3. 主Pane占据整个屏幕宽度,其他Pane在其下并排堆叠。
  4. 主Pane占据整个屏幕高度,其他Pane在其旁边并排堆叠。
  5. 所有Pane都排列在一个网格中。

启动tmux并创建4个(或任何数量的)Pane。

要循环浏览不同的预设布局,请使用CTRL + B,然后SPACE

您还可以选择特定的布局:

  • CTRL + B,然后META + 1:切换到布局1。
  • CTRL + B,然后META + 2:切换到布局2。
  • CTRL + B,然后META + 3:切换到布局3。
  • CTRL + B,然后META + 4:切换到布局4。
  • CTRL + B,然后META + 5:切换到布局5。

交换Pane位置

当一个窗口中有多个Pane时,您可以移动Pane并交换它们的位置。

注意:如前所述,CTRL + B,然后O将光标循环浏览不同的Pane。上述序列用于循环浏览Pane本身的位置。

  • CTRL + B,然后META + O顺时针循环Pane的位置。
  • CTRL + B,然后CTRL + O逆时针循环Pane的位置。

单独分离和重新连接Pane

在具有多个Pane的布局中,有时需要将Pane移动到不同的位置。交换Pane位置(如上所述)并不总是足够的,因为它会打扰所有其他Pane的位置。有时也需要将Pane移动到同一会话中的不同窗口中。

在tmux命令提示符中使用命令break-pane将Pane从窗口中分离。join-pane重新连接Pane。

要访问tmux命令提示符,请按前缀CTRL + B,然后按:。这将在终端底部打开一个提示符。要在不输入任何命令的情况下退出它,请按CTRL + C。

要分离Pane,请切换到要分离的Pane,激活tmux命令提示符(CTRL + B,然后:),然后输入命令:

break-pane -dP

这将分离活动的Pane并显示其“ID”。此ID的格式为X:Y.Z,其中X、Y和Z是数字。上一个Pane将成为新的活动Pane。该ID显示在(新的)活动Pane的顶部。记下此ID,然后按ESC键取消它。

分离的Pane可以重新连接到同一会话中任何窗口旁边的任何Pane。切换到要重新连接分离的Pane旁边的Pane。激活tmux命令提示符,然后输入:

join-pane -vs X:Y.Z

这将在活动Pane下重新连接分离的Pane(vs代表垂直分割)。要在活动Pane的右侧重新连接分离的Pane:

join-pane -hs X:Y.Z

在上面的命令中,hs代表水平分割

在用户之间共享 tmux 会话

会话的工作原理

当您启动 tmux 时,它会创建一个新的服务器实例,并在该服务器内创建一个会话。

Tmux 客户端和服务器是独立的进程。它们通过 UNIX 套接字通信。默认情况下,tmux 将套接字存储在 /tmp 目录中。由个人用户创建的服务器的套接字存储在名为 tmux-UID 的子目录中,其中 UID 是该用户的 UNIX UID。UID 为 1001 的用户将其套接字存储在 /tmp/tmux-1001 中。此子目录的所有者是 user1。默认情况下,没有其他用户或组可以访问此子目录。

兼容性

本节中描述的步骤已在 vanilla Debian 11 安装上的 tmux 版本 3.1 和 3.3 上进行了测试。它们适用于所有最新的 tmux 版本。

注意: 在诸如 SELinux 等安全加固的操作系统上,更改组和权限可能需要额外的步骤。讨论这些超出本指南的范围。假定您知道如何在操作系统上更改组和权限。

Tmux 版本 3.3(于2022年6月发布)在会话共享的方式上引入了与安全相关的更改。这些更改涉及使用新添加的 server-access 命令。使用 tmux -V 检查您的 tmux 安装的版本。在实践中,这导致 tmux 版本 3.3 及更高版本需要一个额外的步骤。

系统说明

考虑一个具有两个用户的系统:user1,其 UID 为 1001,和 user2,其 UID 为 1002。

为了让 user2 能够连接到 user1 创建的 tmux 会话,user2 必须访问 user1 创建的服务器的套接字,以便由 user2 创建的客户端可以与由 user1 创建的服务器通信,并且(对于版本 3.3 及更高版本)由 user1 使用 server-access 命令授予对服务器的访问权限。

在执行以下步骤时,基于您自己的系统使用相应的用户 ID 和用户名。检查用户 user1 的 UID(和其他细节):

$ id user1

不带任何参数的 id 命令显示当前用户的 UID(和其他细节)。

步骤

以下步骤描述了如何让 user2 访问 user1 的 tmux 会话。

  1. 在终端会话中,作为 user1 登录。
  2. 启动一个 tmux 会话: $ tmux 这将创建套接字(子)目录,如果之前不存在的话。
  3. 检查套接字目录的所有权和权限: $ ls -hdl /tmp/tmux-1001
  4. user1user2 创建一个公共组,这将使权限管理更加容易。创建一个新组 tmuxusers# groupadd tmuxusers
  5. user1user2 添加到该组中: # usermod -a -G tmuxusers user1 # usermod -a -G tmuxusers user2
  6. 更改 /tmp/tmux-1001 目录的组为 tmuxusers# chgrp -R tmuxusers /tmp/tmux-1001
  7. user2 需要完全访问 user1 启动的 tmux 服务器的套接字。将组赋予目录的完全权限: # chmod -R g+rwx /tmp/tmux-1001
  8. 验证目录的组已更改为 tmuxusers,并且该组具有目录的完全权限: $ ls -hdl /tmp/tmux-1001
  9. 退出运行的 tmux 会话: $ exit
  10. 作为 user1(再次),创建一个新的 tmux 会话,并指定套接字的名称: $ tmux -L socket1
  11. L 选项创建了一个名为 socket1 的命名套接字,路径为 /tmp/tmux-1001/socket1
  12. 到目前为止的所有命令都适用于所有最新版本的 tmux。下面的 3 个命令仅适用于 tmux 版本 3.3 及更高版本。
    1. 在新创建的 tmux 会话中,将 user2 授权访问 tmux 服务器: $ tmux server-access -w -a user2
    2. 上述命令授予 user2 写访问权限。因此 user2 也可以在会话中输入命令。可以为 user2 仅授予读访问权限。具有只读访问权限的 user2 只能查看会话的内容,但无法输入任何命令。要为 user2 授予只读访问权限,请在上述命令中使用 r 替换 w$ tmux server-access -r -a user2
    3. user1 可以撤销授予 user2 的权限: $ tmux server-access -d user2
    上述三个命令仅适用于 tmux 版本 3.3 及更高版本。进一步的步骤适用于所有最新版本的 tmux。
  13. 更改新套接字文件的组: # chgrp tmuxusers /tmp/tmux-1001/socket1
  14. 验证套接字文件的组为 tmuxusers,并且该组可以访问该文件: # ls -l /tmp/tmux-1001/socket1
  15. 检查打开的会话的 ID: $ tmux ls
  16. 在另一个终端中,以 user2 登录。启动 tmux 并指定由 user1 创建的命名套接字的路径: $ tmux -S /tmp/tmux-1001/socket1 ls 上述命令显示由 user1 创建且监听 socket1 上的服务器上的会话列表。
  17. 连接到会话: $ tmux -S /tmp/tmux-1001/socket1
  18. 如果有许多打开的会话,请连接到特定会话(其 ID 为 N): $ tmux -S /tmp/tmux-1001/socket1 attach -t N

user2 现在连接到 user1 的 tmux 会话。

使用嵌套会话

通常,不建议在 tmux 中使用嵌套会话。但是,在从本地 tmux 会话连接到远程 tmux 会话时,它是有用的。假设您在本地计算机上的一个 tmux 会话中。在其中一个面板(或窗口)中,您登录到远程服务器,该服务器也有运行的 tmux 会话。当您连接到此远程服务器上的 tmux 会话时,您将获得嵌套的会话。远程 tmux 会话嵌套在本地 tmux 会话中。

要将键序列传递到嵌套会话中,请连续按下两个会话的前缀键组合。假设两个会话都使用默认的前缀键,则按两次 CTRL+B 即可访问嵌套会话。

例如,要在嵌套会话中进行垂直拆分,请输入:CTRL+B,然后按两次 CTRL+B,然后输入 %。