Linux VPS上使用tmux的完整指南
学习如何在Linux VPS上安装和使用tmux,实现持久终端会话、分屏工作流,以及SSH断连保护。适用于Debian 12和Ubuntu 24.04。
你SSH连入VPS,启动了一个耗时很长的数据库迁移,然后Wi-Fi断了。进程被杀。工作全部丢失。
tmux解决这个问题。它把终端session(会话)运行在服务器上,不依赖你的SSH连接。断开、重连,一切从断点继续。
本教程从安装tmux讲起,到编写多pane(窗格)布局脚本。所有命令在Debian 12或Ubuntu 24.04上运行。
什么是tmux?为什么在VPS上使用?
tmux是一个terminal multiplexer(终端复用器)。它允许你在一个SSH连接里运行多个终端session,而且这些session在你断开后仍然保留在服务器上。
tmux的工作结构分为三个层级:
- Session(会话) 是最顶层的容器。每个session是一个独立的工作区。你可以从session分离,之后再重新连接。
- Window(窗口) 存在于session内部。可以理解为标签页。每个window运行自己的shell。
- Pane(窗格) 把一个window分割成多个矩形区域,每个区域运行自己的命令。
Session "deploy"
├── Window 0: "editor"
│ ├── Pane 0: vim
│ └── Pane 1: file watcher
└── Window 1: "logs"
└── Pane 0: journalctl -f
在VPS上,tmux提供三个关键能力:
- SSH断连保护。 连接断开时,进程继续运行。重连后重新attach(连接)即可。
- 多pane工作流。 一个pane看日志,另一个跑命令,第三个编辑文件。全部在一个SSH连接里完成。
- Session持久化。 session可以连续运行数天。下班前detach(分离),第二天重新attach。
如何在Debian 12和Ubuntu 24.04上安装tmux?
tmux在Debian 12和Ubuntu 24.04的默认软件源中。一条命令即可安装。
sudo apt update && sudo apt install -y tmux
验证安装:
tmux -V
Debian 12上的预期输出:
tmux 3.3a
Ubuntu 24.04上的预期输出:
tmux 3.4
注意观察:版本号确认tmux是从官方软件源安装的。如果没有输出或提示"command not found",说明安装失败。检查apt输出的错误信息。
如何创建和管理tmux session?
tmux session是服务器上的持久工作区。创建一个,运行你的命令,即使关闭终端它也不会消失。
创建session
创建一个带名称的session:
tmux new-session -s deploy
这会创建一个名为"deploy"的session并自动连接进去。终端底部会出现一条绿色状态栏,确认你已经在tmux session内部。
创建session但不连接(适用于脚本):
tmux new-session -d -s background
验证它是否存在:
tmux list-sessions
background: 1 windows (created Thu Mar 19 10:00:00 2026)
如何从tmux session分离并稍后重新连接?
这是VPS上的核心工作流。从session分离以释放终端,稍后重新连接以恢复工作。session在服务器上持续运行。
要分离,按**prefix key(前缀键)**后按d:
Ctrl-b d
默认的prefix key是Ctrl-b。同时按下Ctrl和b,松开,然后按d。tmux的每个快捷键都是这个模式:先按prefix,再按功能键。
终端回到普通shell。session仍在运行。
重新连接:
tmux attach -t deploy
如果只有一个session,可以省略名称:
tmux attach
查看正在运行的session:
tmux list-sessions
deploy: 1 windows (created Thu Mar 19 10:00:00 2026) (attached)
background: 1 windows (created Thu Mar 19 10:05:00 2026)
(attached)标签表明你的终端当前连接到哪个session。
销毁session
不再需要某个session时,销毁它:
tmux kill-session -t background
验证已删除:
tmux list-sessions
杀死所有session并完全停止tmux server:
tmux kill-server
重命名session
在session内部,按:
Ctrl-b $
输入新名称后按Enter。当你创建session时没有指定名称,tmux会自动分配一个数字,这时重命名很有用。
如何使用tmux window组织任务?
Window是session内部的标签页。每个window运行自己的shell。用它们分隔不需要同时显示的任务。
创建新window:
Ctrl-b c
状态栏更新,显示新window。星号(*)标记当前活动的window:
[deploy] 0:bash 1:bash*
在window之间切换
按编号切换:
Ctrl-b 0 # Go to window 0
Ctrl-b 1 # Go to window 1
循环切换:
Ctrl-b n # Next window
Ctrl-b p # Previous window
重命名window
Ctrl-b ,
输入有意义的名称如"logs"或"editor",按Enter。当你打开多个window时,命名让状态栏更易读。
关闭window
在shell中输入exit,或按:
Ctrl-b &
tmux会在关闭前要求确认。
如何将终端分割为pane?
Pane把一个window分割成同时可见的多个终端。这是tmux在VPS管理中最有价值的功能:一个pane看日志,另一个跑命令。
水平分割当前pane(上下两部分):
Ctrl-b "
垂直分割当前pane(左右两部分):
Ctrl-b %
分割后你有两个pane。绿色边框高亮显示当前活动的pane。
如何在tmux pane之间导航和调整大小?
用方向键在pane之间移动:
Ctrl-b ↑ # Move to pane above
Ctrl-b ↓ # Move to pane below
Ctrl-b ← # Move to pane left
Ctrl-b → # Move to pane right
按住prefix再按Ctrl加方向键调整pane大小:
Ctrl-b Ctrl-↑ # Resize pane up
Ctrl-b Ctrl-↓ # Resize pane down
Ctrl-b Ctrl-← # Resize pane left
Ctrl-b Ctrl-→ # Resize pane right
缩放pane
需要暂时让一个pane全屏?切换缩放模式:
Ctrl-b z
再按一次恢复分割布局。pane处于缩放状态时,状态栏的window名称旁会显示Z。
关闭pane
在pane中输入exit,或按:
Ctrl-b x
tmux会要求确认。如果关闭了window中的最后一个pane,window也会关闭。
交换pane位置
旋转pane位置:
Ctrl-b { # Move current pane left/up
Ctrl-b } # Move current pane right/down
如何使用tmux copy mode滚动和搜索?
默认情况下,你无法在tmux pane中使用鼠标滚轮或Page Up向上滚动。Copy mode(复制模式)提供回滚、搜索和文本选择功能。
进入copy mode:
Ctrl-b [
你现在处于copy mode中。右上角显示你在scrollback buffer(回滚缓冲区)中的位置(例如[0/500])。
在copy mode中导航
tmux默认使用emacs风格的按键。如果你的EDITOR或VISUAL环境变量包含"vi",则使用vi风格的按键。
Emacs模式(默认):
| 操作 | 按键 |
|---|---|
| 向上滚动 | Ctrl-Up或Page Up |
| 向下滚动 | Ctrl-Down或Page Down |
| 移动光标 | 方向键 |
| 行首 | Ctrl-a |
| 行尾 | Ctrl-e |
| 向前搜索 | Ctrl-s |
| 向后搜索 | Ctrl-r |
| 开始选择 | Ctrl-Space |
| 复制选择 | Alt-w |
| 退出copy mode | q |
Vi模式:
| 操作 | 按键 |
|---|---|
| 向上滚动 | Ctrl-u(半页) |
| 向下滚动 | Ctrl-d(半页) |
| 移动光标 | h j k l |
| 向前搜索 | / |
| 向后搜索 | ? |
| 开始选择 | Space |
| 复制选择 | Enter |
| 退出copy mode | q |
复制后,粘贴:
Ctrl-b ]
注意观察:copy mode是搜索长命令输出的方式。如果构建失败且错误信息已滚出屏幕,进入copy mode用Ctrl-r(emacs)或?(vi)向后搜索。
如何用.tmux.conf自定义tmux?
tmux server启动时读取~/.tmux.conf配置文件。tmux 3.2及更高版本还会检查~/.config/tmux/tmux.conf。
以下配置适合VPS管理场景。每行都有说明。
创建或编辑配置文件:
nano ~/.tmux.conf
# -- General -----------------------------------------------------------------
# Change prefix from Ctrl-b to Ctrl-a (easier to reach)
set -g prefix C-a
unbind C-b
bind C-a send-prefix
# Start window numbering at 1 (0 is far from the prefix key)
set -g base-index 1
setw -g pane-base-index 1
# Renumber windows when one is closed (no gaps)
set -g renumber-windows on
# Increase scrollback buffer (default is 2000 lines)
set -g history-limit 50000
# Reduce escape delay (snappier key response)
set -g escape-time 10
# Enable mouse support (scroll, click panes, resize)
set -g mouse on
# -- Display -----------------------------------------------------------------
# 256-color terminal support
set -g default-terminal "tmux-256color"
# -- Key Bindings ------------------------------------------------------------
# Split panes with | and - (more intuitive than " and %)
bind | split-window -h -c "#{pane_current_path}"
bind - split-window -v -c "#{pane_current_path}"
unbind '"'
unbind %
# Navigate panes with Alt-arrow (no prefix needed)
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
# Reload config with prefix r
bind r source-file ~/.tmux.conf \; display-message "Config reloaded"
# -- Copy Mode ---------------------------------------------------------------
# Use vi keys in copy mode
setw -g mode-keys vi
# -- Status Bar --------------------------------------------------------------
# Status bar position
set -g status-position bottom
# Update interval (seconds)
set -g status-interval 5
# Clean status bar colors
set -g status-style "bg=colour235,fg=colour136"
set -g status-left "#[fg=colour235,bg=colour136] #S #[fg=colour136,bg=colour235] "
set -g status-right "#[fg=colour136] %H:%M %d-%b-%Y "
set -g status-left-length 20
保存退出。将配置应用到正在运行的tmux session:
tmux source-file ~/.tmux.conf
按Ctrl-a(新的prefix)而不是Ctrl-b来验证。如果有效,说明配置已正确加载。
设置配置文件权限:
chmod 600 ~/.tmux.conf
ls -la ~/.tmux.conf
-rw------- 1 youruser youruser 1234 Mar 19 10:00 /home/youruser/.tmux.conf
600权限表示只有你的用户可以读写该文件。如果你在tmux配置中存储了自定义脚本或敏感路径,这一点很重要。
默认设置变更说明:
- Prefix改为
Ctrl-a,按键位置在左手小指下方。Ctrl-b需要伸展手指。这是最常见的重新绑定。 base-index 1让window从1开始编号而不是0。按Ctrl-a 1切换到第一个window更自然。history-limit 50000每个pane存储50000行回滚记录。默认的2000行对于查看日志来说太少。escape-time 10减少tmux在收到Escape键后的等待时间。默认值(500ms)会让Vim在tmux中感觉迟钝。-c "#{pane_current_path}"让分割绑定在当前目录中打开新pane,而不是home目录。mode-keys vi将copy mode切换为vi风格导航。如果你更喜欢emacs风格,改为emacs。
如何用tpm安装tmux插件?
tmux Plugin Manager (tpm)让你从GitHub安装插件。两个值得了解的插件:
- tmux-resurrect 在服务器重启后保存和恢复tmux session
- tmux-continuum 按固定间隔自动保存session
安装tpm
克隆仓库:
git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
在~/.tmux.conf底部添加以下内容:
# -- Plugins -----------------------------------------------------------------
# Plugin manager
set -g @plugin 'tmux-plugins/tpm'
# Save/restore sessions across reboots
set -g @plugin 'tmux-plugins/tmux-resurrect'
# Auto-save sessions every 15 minutes
set -g @plugin 'tmux-plugins/tmux-continuum'
set -g @continuum-restore 'on'
# Initialize tpm (keep this line at the very bottom)
run '~/.tmux/plugins/tpm/tpm'
重新加载配置:
tmux source-file ~/.tmux.conf
在tmux内部安装插件:
Ctrl-a I
注意是大写I。tpm会获取并安装插件。完成后会显示提示信息。
验证插件已安装:
ls ~/.tmux/plugins/
tmux-continuum tmux-resurrect tpm
使用tmux-resurrect
保存当前session布局:
Ctrl-a Ctrl-s
重启后恢复:
Ctrl-a Ctrl-r
tmux-resurrect保存window布局、pane分割和每个pane的当前目录。启用tmux-continuum后,每15分钟自动执行一次保存。
如何处理嵌套tmux session(SSH中的SSH)?
当你在本地运行tmux,然后SSH到一台同样运行tmux的VPS时,形成了tmux嵌套。两个实例响应相同的prefix key。你的按键会被外层(本地)tmux捕获,而不是内层(远程)tmux。
解决方法:按两次prefix key,将prefix传递到内层session。
Ctrl-a Ctrl-a d # Detach the inner (remote) session
第一个Ctrl-a被外层tmux捕获。第二个Ctrl-a作为prefix转发给内层tmux。然后d分离内层session。
更简洁的方法:使用不同的prefix key。本地保持Ctrl-a,远程服务器保留默认的Ctrl-b。这样就没有冲突。
如果你已经在两端都修改了prefix,在本地的~/.tmux.conf中添加切换功能:
# Toggle prefix passthrough with F12
bind -T root F12 \
set prefix None \;\
set key-table off \;\
set status-style "bg=colour238,fg=colour240" \;\
display-message "Prefix OFF (sending to inner)"
bind -T off F12 \
set -u prefix \;\
set -u key-table \;\
set -u status-style \;\
display-message "Prefix ON (local)"
按F12禁用本地prefix,所有按键传递到远程tmux。再按F12重新启用。变暗的状态栏给你一个视觉指示,告诉你当前处于哪种模式。
如何为服务器管理创建脚本化tmux布局?
不必每次SSH连入时手动分割pane,把布局写成脚本。一条命令创建可重复的工作区。
创建脚本:
nano ~/tmux-admin.sh
#!/usr/bin/env bash
# tmux-admin.sh: three-pane admin layout
SESSION="admin"
# Kill old session if it exists
tmux kill-session -t "$SESSION" 2>/dev/null
# Create session with first window named "monitor"
tmux new-session -d -s "$SESSION" -n "monitor"
# Top pane: system monitoring
tmux send-keys -t "$SESSION:monitor" "htop" C-m
# Split horizontally: bottom pane for logs
tmux split-window -v -t "$SESSION:monitor"
tmux send-keys -t "$SESSION:monitor.1" "journalctl -f" C-m
# Split bottom pane vertically: right pane for shell
tmux split-window -h -t "$SESSION:monitor.1"
# Create second window for a working shell
tmux new-window -t "$SESSION" -n "work"
# Select the first window
tmux select-window -t "$SESSION:monitor"
# Select the bottom-right pane (the empty shell)
tmux select-pane -t "$SESSION:monitor.2"
# Attach to the session
tmux attach -t "$SESSION"
设置可执行权限并运行:
chmod 700 ~/tmux-admin.sh
~/tmux-admin.sh
你会得到一个三pane布局:顶部是htop,左下是journalctl -f,右下是空shell。第二个名为"work"的window可用于临时命令。
注意观察:send-keys末尾的C-m是回车符,它按下Enter来执行命令。
用systemd在开机时自动启动tmux
对于长期运行的管理session,创建一个systemd service:
sudo nano /etc/systemd/system/tmux-admin@.service
[Unit]
Description=tmux admin session for %i
After=network.target
[Service]
Type=forking
User=%i
ExecStart=/usr/bin/tmux new-session -d -s admin
ExecStop=/usr/bin/tmux kill-session -t admin
[Install]
WantedBy=multi-user.target
为你的用户启用并启动:
sudo systemctl enable --now tmux-admin@youruser.service
验证运行状态:
sudo systemctl status tmux-admin@youruser.service
● tmux-admin@youruser.service - tmux admin session for youruser
Loaded: loaded (/etc/systemd/system/tmux-admin@.service; enabled)
Active: active (running)
现在tmux会在开机时自动创建一个名为"admin"的session。SSH连入后直接attach:
tmux attach -t admin
安全:tmux socket权限
tmux创建socket(套接字)文件用于server和client进程之间的通信。默认情况下,socket位于/tmp下的目录中(例如/tmp/tmux-1000/)。
检查你的socket目录:
ls -la /tmp/tmux-$(id -u)/
srwxrwx--- 1 youruser youruser 0 Mar 19 10:00 default
socket目录归你的用户所有,权限设置阻止其他用户访问。这意味着同一服务器上的其他用户无法连接到你的tmux session。
但是,如果你以root身份运行tmux,任何以root运行的进程都可以连接。日常工作中避免以root运行tmux。以普通用户SSH连入,需要时对单条命令使用sudo。
如果需要共享tmux session(用于结对编程或指导),显式使用共享socket:
tmux -S /tmp/shared-session new-session -s pair
chmod 770 /tmp/shared-session
另一个用户连接:
tmux -S /tmp/shared-session attach -t pair
完成后撤销权限:
chmod 700 /tmp/shared-session
常见问题排查
tmux: command not found
软件包未安装。运行sudo apt install -y tmux并检查错误。
"no server running on /tmp/tmux-1000/default"
没有tmux session存在。用tmux new-session -s main创建一个。
按键无响应/prefix错误
检查当前活动的prefix:tmux show-options -g prefix。如果你在.tmux.conf中修改了prefix,用tmux source-file ~/.tmux.conf重新加载。
鼠标滚动不工作
在~/.tmux.conf中添加set -g mouse on并重新加载。tmux 2.1之前的版本使用set -g mode-mouse on(语法不同)。
tmux内颜色显示异常
在~/.tmux.conf中设置set -g default-terminal "tmux-256color"。如果你的终端模拟器支持true color(24位色),添加:
set -as terminal-overrides ",*-256color:Tc"
重启后session丢失 tmux session默认不会在重启后保留。使用tmux-resurrect和tmux-continuum(上文已介绍),或创建systemd service在开机时自动启动session。
Vim退出插入模式很慢
默认的escape-time(500ms)导致此问题。在~/.tmux.conf中设置set -g escape-time 10。
查看tmux日志排查深层问题:
tmux start-server \; show-messages
或查看系统日志:
journalctl -u tmux-admin@youruser.service -f
tmux快捷键速查表
本表使用默认prefix Ctrl-b。如果你已将prefix重新绑定为Ctrl-a(如上述配置),请使用新的prefix。
Session
| 操作 | 快捷键 | 命令 |
|---|---|---|
| 新建命名session | tmux new-session -s name |
|
| 分离 | Ctrl-b d |
tmux detach |
| 列出session | Ctrl-b s |
tmux list-sessions |
| 连接 | tmux attach -t name |
|
| 重命名session | Ctrl-b $ |
tmux rename-session |
| 杀死session | tmux kill-session -t name |
Window
| 操作 | 快捷键 | 命令 |
|---|---|---|
| 新建window | Ctrl-b c |
|
| 下一个window | Ctrl-b n |
|
| 上一个window | Ctrl-b p |
|
| 按编号切换 | Ctrl-b 0-9 |
|
| 重命名window | Ctrl-b , |
|
| 关闭window | Ctrl-b & |
|
| 列出window | Ctrl-b w |
Pane
| 操作 | 快捷键 | 命令 |
|---|---|---|
| 水平分割 | Ctrl-b " |
|
| 垂直分割 | Ctrl-b % |
|
| 导航 | Ctrl-b Arrow |
|
| 调整大小 | Ctrl-b Ctrl-Arrow |
|
| 缩放切换 | Ctrl-b z |
|
| 关闭pane | Ctrl-b x |
|
| 交换pane | Ctrl-b { / Ctrl-b } |
Copy Mode
| 操作 | 快捷键 |
|---|---|
| 进入copy mode | Ctrl-b [ |
| 粘贴缓冲区 | Ctrl-b ] |
| 搜索(emacs) | Ctrl-r(向后)/ Ctrl-s(向前) |
| 搜索(vi) | ?(向后)/ /(向前) |
| 退出 | q |
其他
| 操作 | 快捷键 |
|---|---|
| 命令提示符 | Ctrl-b : |
| 列出所有快捷键 | Ctrl-b ? |
| 时钟模式 | Ctrl-b t |
Copyright 2026 Virtua.Cloud. All rights reserved.