tmux使用详解

tmux是一个终端复用软件,那么什么是终端复用软件呢?或者说它有什么用呢?
正常情况下,我们连接Linux服务器,一般会通过xshell这类工具或者直接使用ssh命令来登录,而在操作Linux服务器时不可避免的会遇到操作被阻塞的这类情况,比如apt-get下载安装一个软件或者用docker拉取一个比较大的镜像,而这时候我们又想进行其他操作,比如mv一个文件或者关机回家,如果是前者还好说,再打开一个终端窗口,再次创建ssh连接即可,但是如果你要关机回家,那这个阻塞执行的进程也就挂掉了。而针对刚才提到的这两种场景,使用tmux就能很好的解决这些问题。 tmux最主要的几个特性:

  • 可以通过一个ssh终端连接创建出多个可管理的终端
  • 由tmux创建的终端可以自由分离并保持在后台运行,断开ssh连接也没关系。
  • 可以随时切回分离的在后台运行的终端
  • 可以在多个tmux终端中灵活切换

安装

tmux安装起来非常简单,不过当然是没有win什么事儿的,主流平台安装命令如下:

Ubuntu

apt-get install tmux

centos

yum install tmux

mac

brew install tmux

概念

要使用tmux首先要了解tmux的几个概念
我们平时通过ssh连接进行shell操作,都是通过一个终端界面进行的,我们对此的感知就是通过一个工具窗口远程操控Linux,想双线操作的话就会再打开一个工具窗口再次创建ssh连接。
> 这里为了区分shell连接工具的窗口和tmux窗口的概念,称shell连接工具的窗口为工具窗口,window特指tmux窗口。

承接上文,在传统操作中,要实现双线操作,我们只能新建工具窗口再次远程连接。而使用tmux则并不用这么做,tmux在我们当前的shell中创建出很多个shell,而这些创建出的shell也并不是线性存在的,而是一个三级的树型结构。 如下图结构所示: tmux结构图 由tmux创建的终端都是处于三级结构的末级节点,也就是pane节点,默认情况下用tmux创建一个终端,则会创建一个session,session中会包含一个Window,这个window下包含一个pane,而这个pane就被认作是一个新的终端。

界面说明

上面提到,tmux的结构是固定三级的,也就是说只要用使用了tmux,那么tmux创建的终端一定是处于三级结构的pane节点。
所以用tmux创建一个session,就会默认帮我们创建一个三级的一叉树结构,并在末级的pane就绪。命令是:

tmux new -s 名称  

使用上述命令创建一个名为test的session,创建完成后我们会看到shell界面被清空了,但之前的shell界面并不是被清空了,而是被缓存起来了,tmux用创建了一个新的终端,这时候我们使用tmux ls命令查看tmux的所有session:

我们看到了两个,一个是demo,一个是test,叫做demo的session是我之前创建的,test是通过tmux new -s test创建的。后面分别标记了两个session包含的window数量,demo是4个,test是1个。再然后是创建日期,终端的尺寸,以及session的状态(是否分离)。
和普通的shell相比,tmux的终端下面多了一条绿色的状态栏,状态栏展示了当前session的名称[test]0:~*则代表当前的window是0号index,window名是默认的~,*号是指当前window是激活状态,右下角“bogon”是主机名,然后就是时间和日月年。
看下面这个界面

由状态栏中的[demo]可以看出这是出于一个叫做demo的session中;
0:A 1:B* 2:C- 3:D 这串信息代表了demo会话中有四个名为A、B、C、D的window,B后面有个*标识代表当前shell是处于B窗口中,C后面有个-标识代表C窗口是上一次使用的窗口;
界面中的0、1、2代表B窗口中有三个pane,红色的2号代表当前处于激活状态的shell,同时激活状态的shell的边框也是用绿色标识了。0、1、2这三个数字是通过ctrl+b q命令显示出来,短暂停留后就会消失,不会影响使用。

通过ctrl+b s命令可以在几个session之间灵活切换,方向键和回车键选择确认,切换到另外的session时,会把window及pane内的shell分离并保持在后台运行,可以再通过这个命令切换回来,而不影响shell中任务的执行。如图:

ctrl+b t让当前shell显示为当前时间,这是一个工具类的命令,实际使使用中可以用一小块儿区域来做时钟:

各个pane之间被分割线隔开,绿色分割线包围的pane是当前激活的终端,使用ctrl+b 方向键来在当前window中切换各个pane,使用ctrl+b "左右分割当前pane,如图:

使用ctrl+b x或者ctrl+d命令可以退出当前shell也就是对应的pane,当一个window中的pane全部退出时,当前window被销毁自动切换到下一个window,当一个session中的window全部销毁时,session会被销毁并退出回常规shell。
切换右上角的pane为激活状态,并关闭这个pane:

常用命令

  • 系统命令是指在命令行输入进行tmux操作的命令
  • session、window、pane的命令是指在tmux终端中才能使用的命令,这些命令需要使用前缀命令,将这三者区分开来记录是为了方便概念上的理解,实际场景中是可能混合使用的。

系统

命令 简写 说明
tmux new-session tmux tmux new 创建匿名会话
tmux new -s 会话名称 创建指定命名的会话
tmux new -n 窗口名称 创建指定窗口名的会话,在使用zsh时不生效,可以和-s一起使用。
tmux new -d 创建一个会话并保持在后台,可以和-s -n一起使用
tmux ls 查看会话列表
tmux attach tmux a 连接到最近使用的一个会话
tmux attach -s 会话名 tmux a -s 会话名 连接到指定名称的会话
tmux detach-client tmux detach 分离最近的会话并保持在后台,效果同ctrl+b d
tmux kill-pane tmux killp 销毁最近的一个pane,或者使用-t指定pane的index进行销毁,
tmux kill-window tmux killw 销毁最近的一个window,或者使用-t指定window名称进行销毁
tmux kill-session 销毁最近的一个session,或者使用-t指定session名称进行销毁
tmux kill-server 销毁所有session、client、server
tmux rename-session [-t target-session] new-name 重命名当前或指定session

更多命令 使用tmux tab键查看


session会话

前缀命令 命令 说明
ctrl+b d 分离当前会话,保持后台运行
ctrl+b D 在当前主机多个session被激活时,会提示要分离的session列表选择项,选择要分离的session。
ctrl+b s 显示session列表,选择跳转。
ctrl+b r 某些原因造成界面显示异常时,让tmux重新绘制界面

window窗口

前缀命令 命令 说明
ctrl+b c 创建新窗口
ctrl+b & 关闭当前窗口
ctrl+b , window重命名
ctrl+b w 显示window列表,选择跳转,跨session。
ctrl+b n 跳转到下一个window
ctrl+b p 跳转到下一个window
ctrl+b l 在最近使用的一个window间相互跳转
ctrl+b 0~9 跳转到index为0~9的window
ctrl+b . 修改当前window的编号,相当于排序
ctrl+b f 在所有session、window、pane中查找文本

pane面板

前缀命令 命令 说明
ctrl+b % 左右切分pane
ctrl+b 上下切分pane
ctrl+b q 显示当前window中pane的编号
ctrl+b o 在当前window中切换下一个pane为激活状态
ctrl+b 方向键 在当前window中选择pane切换为激活状态
ctrl+b alt+方向键 大幅调整pane边界
ctrl+b z 最大化pane,再次执行恢复。
ctrl+b ! 把当前pane移动一个新创建的window中
ctrl+b x 退出pane
ctrl+d 强制退出pane,这个其实是shell的退出热键,退出当前shell其实也就是退出当前pane
ctrl+b alt+方向键 大幅调整pane边界
ctrl+b ctrl+方向键 小幅调整pane边界,Mac上热键中途
ctrl+b 空格键 调整当前window中的pane布局,预置的几个布局。
ctrl+b { 于前一个pane交换位置。
ctrl+b } 与后一个pane交换位置。
ctrl+b ctrl+o 逆时针旋转pane的布局。
ctrl+b alt+o 顺时针旋转pane的布局。Mac上热键中途
ctrl+b [ 进入复制模式
ctrl+b ] 粘贴复制到的文本内容

复制模式中使用方向键移动光标,空格键开始选择,v键切换选择模式,回车键确认复制。

自定义配置

在~/下编辑文件.tmux.conf文件

# 设置前缀命令为ctrl+a
set-option -g prefix C-a
unbind-key C-a
bind-key C-a send-prefix

# 设置直接使用alt+方向键切换pane
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D

# 设置使用shift+左右键切换window
bind -n S-Left previous-window
bind -n S-Right next-window

# 开启鼠标模式 可以通过鼠标点击切换pane和window 可以拖拽调整pane尺寸
set -g mouse on

# 快速加载配置文件,使用前缀命令+r即可,不用关闭session
bind-key r source-file ~/.tmux.conf \; display-message "tmux.conf 文件重进加载"

# 关闭窗口名字被默认修改,这样通过前缀命令+,修改后在再次手动修改前都不会变更。
set-option -g allow-rename off

#  #设置终端颜色为256色
set -g default-terminal "screen-256color"

# 重定义分隔窗格快捷键, %和"不好记也不好操作,换为horizontal和vertical的首字母,这样更容易理解和操作
unbind '"'
unbind %
bind-key h split-window -h
bind-key v split-window -v

# 设置复制模式的按键为vim风格
set -g mode-keys vi

tmux source-file ~/.tmux.conf或者tmux kill-server然配置生效

开启鼠标模式后,原有的鼠标拉取文本会失效,也就不能正常的选取文本进行复制了。

Mac 下如果用 iterm2 可以在 preference 下选择 Applications in terminal may access clipboard。让tmux的粘贴板和操作系统的粘贴板共享。

文章目录
,