使用 tmux
告别进程的 SSH 掉线杀,从使用 tmux 开始。
2025 年了,谁还用 screen 啊
直接搬 Tmux Cheat Sheet & Quick Reference,也可以看 tmux wiki 和 manual。
功能及快捷键
: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
0
…9
切换到上次的窗口
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
0
…9
开/关放大窗格(最大化)
Ctrl
+b
z
转换窗格为窗口
Ctrl
+b
!
调整当前窗格高度
Ctrl
+b
+↑
(按住 Ctrl
和 b
时可连续按 ↑
)
Ctrl
+b
Ctrl
+↑
(第二次按住 Ctrl
时可连续按 ↑
)
Ctrl
+b
+↓
(按住 Ctrl
和 b
时可连续按 ↓
)
Ctrl
+b
Ctrl
+↓
(第二次按住 Ctrl
时可连续按 ↓
)
调整当前窗格宽度
Ctrl
+b
+→
(按住 Ctrl
和 b
时可连续按 →
)
Ctrl
+b
Ctrl
+→
(第二次按住 Ctrl
时可连续按 →
)
Ctrl
+b
+←
(按住 Ctrl
和 b
时可连续按 ←
)
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,就手动从会话中分离出来一下?
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。