告别进程的 SSH 掉线杀,从使用 tmux 开始。

2025 年了,谁还用 screen

直接搬 Tmux Cheat Sheet & Quick Reference,也可以看 tmux wikimanual

功能及快捷键

:command 为进入命令模式(Ctrl+b :)后执行的指令。

会话

新建 tmux 会话

tmux

:new

新建或连接到名为 mysession 的现有会话

tmux new -A -s mysession

新建一个名为 mysession 的会话

tmux new -s mysession

:new -s mysession

杀死/删除当前会话

:kill-ses

杀死/删除名为 mysession 的会话

tmux kill-ses -t mysession

杀死/删除当前会话之外的所有会话

tmux kill-ses -a

杀死/删除名为 mysession 会话之外的所有会话

tmux kill-ses -a -t mysession

重命名会话

Ctrl+b $

分离会话(会话保留在后台)

Ctrl+b d

分离会话中的其他客户端(接管当前会话)

:a -d

列出所有会话

tmux ls

Ctrl+b s

连接到上次的会话

tmux a

连接到名为 mysession 的会话

tmux a -t mysession

预览会话与窗口

Ctrl+b w

切换到上一会话

Ctrl+b (

切换到下一会话

Ctrl+b )

窗口

新建一个名为 mysession 的会话,窗口名为 mywindow

tmux new -s mysession -n mywindow

新建窗口

Ctrl+b c

重命名当前窗口

Ctrl+b ,

关闭当前窗口

Ctrl+b &

列出窗口

Ctrl+b w

切换到上一窗口

Ctrl+b p

切换到下一窗口

Ctrl+b n

按编号切换窗口

Ctrl+b 09

切换到上次的窗口

Ctrl+b l

调整窗口顺序,交换窗口编号 2(源)和 1(目标)

:swapw -s 2 -t 1

向左交换窗口序位

:swapw -t -1

重复执行一次即可复原交换操作。

移动源窗口位置至目标位置

:movew -s src_ses:win -t target_ses:win

  • src_res - 源会话名或编号
  • target_ses - 目标会话名或编号
  • win - 窗口编号

:movew -s foo:0 -t bar:9

:movew -s 0:0 -t 1:9

移动窗口到当前会话

:movew -s src_session:src_window

  • src_session - 源会话名或编号
  • src_window - 源窗口编号

:movew -s 0:9

重新编号窗口,消除序列中的间隙

:movew -r

窗格

切换到上次的窗格

Ctrl+b ;

垂直分割当前窗格

Ctrl+b %

:splitw -h

水平分割当前窗格

Ctrl+b "

:splitw -v

合并窗口至窗格(将窗口 2 作为窗格合并到窗口 1)

:joinp -s 2 -t 1

移动窗格至另一个窗口(将窗口 2 的窗格 1 移到窗口 1 的窗格 0 之后)

:joinp -s 2.1 -t 1.0

向左移动当前窗格

Ctrl+b {

向右移动当前窗格

Ctrl+b }

按方向切换到窗格

Ctrl+b

Ctrl+b

Ctrl+b

Ctrl+b

开/关同步窗格(向所有窗格发送命令)

:setw synchronize-panes

切换窗格布局

Ctrl+b Spacebar

切换到下一窗格

Ctrl+b o

显示窗格编号

Ctrl+b q

按编号切换窗格

Ctrl+b q 09

开/关放大窗格(最大化)

Ctrl+b z

转换窗格为窗口

Ctrl+b !

调整当前窗格高度

Ctrl+b+ (按住 Ctrlb 时可连续按

Ctrl+b Ctrl+ (第二次按住 Ctrl 时可连续按

Ctrl+b+ (按住 Ctrlb 时可连续按

Ctrl+b Ctrl+ (第二次按住 Ctrl 时可连续按

调整当前窗格宽度

Ctrl+b+ (按住 Ctrlb 时可连续按

Ctrl+b Ctrl+ (第二次按住 Ctrl 时可连续按

Ctrl+b+ (按住 Ctrlb 时可连续按

Ctrl+b Ctrl+ (第二次按住 Ctrl 时可连续按

关闭当前窗格

Ctrl+b x

复制模式

设置在缓冲区使用 vi 按键

:setw -g mode-keys vi

进入复制模式

Ctrl+b [

进入复制模式并向上滚动一页

Ctrl+b PgUp

退出复制模式

q

转到顶行

g

转到底行

G

向上滚动

向下滚动

向左移动光标

h

向下移动光标

j

向上移动光标

k

向右移动光标

l

移动光标前进一个词

w

移动光标后退一个词

b

前进搜索

/

后退搜索

?

下一个搜索结果

n

上一个搜索结果

N

开始选择

Spacebar

清除选择

Esc

复制选择(到缓冲区)

Enter

粘贴最新的缓冲区内容

Ctrl+b ]

显示最新的缓冲区内容

:showb

复制整个窗格的可见内容到缓冲区

:capturep

列出所有缓冲区

:lsb

选择缓冲区

:choose-buffer

Enter 可粘贴所选缓冲区,按 d 可删除所选缓冲区。

保存最新缓冲区内容到 buf.txt

:saveb buf.txt

删除缓冲区 buffer1

:deleteb -b buffer1

如不加参数,:deleteb 为删除最新的缓冲区。

其他

进入命令模式

Ctrl+b :

设置 OPTION 到所有会话

:set -g OPTION

设置 OPTION 到所有窗口

:setw -g OPTION

启用鼠标模式

:set mouse on

帮助

列出快捷键

tmux lsk

:lsk

Ctrl+b ?

套娃:从 tmux 里 SSH 到开着 tmux 的远程

这种情况下按 Ctrl+b 的操作只会作用于本地的 tmux,如要对远程的 tmux 进行操作,需要按两次 Ctrl+b

Ctrl+b d 分离本地会话(远程 tmux 仍然活动)

Ctrl+b Ctrl+b d 分离远程会话(本地 tmux 仍然活动)

也许可以通过自定义前缀组合键的方式把本地与远程的操作区分开?我没有尝试。

自定义前缀组合键

默认是 Ctrl+b,如果想改成 Ctrl+a,在 ~/.tmux.conf 中加入:

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

改到 Ctrl+Spacebar

unbind C-b
set -g prefix C-Space
bind C-Space send-prefix

修改后使用 tmux source ~/.tmux.conf 重载配置。

自动启动 tmux

~/.bashrc~/.zshrc 中添加:

if command -v tmux &> /dev/null && [ -z "$TMUX" ]; then
  tmux attach -t default || tmux new -s default
fi

即可在每次启动 bash / zsh 时自动进入 tmux。

如果想看 SSH 的 motd,就手动从会话中分离出来一下?

标签: none

知识共享许可协议 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。

添加新评论