Loading... # tmux 终端复用器完整入门指南 # 一、概述 ## 1. 简介 ### A. 是什么 tmux 是一个终端复用器(terminal multiplexer),它在一个终端中运行,并允许在内部运行多个其他终端程序。tmux 为每个内部程序管理独立的终端,可以从单个运行 tmux 的终端访问这些程序。这种技术称为多路复用,tmux 就是一个终端多路复用器。 ### B. 为什么学 - 保护远程服务器上运行的程序免受连接断开影响 - 允许多台不同本地计算机访问远程服务器上运行的程序 - 在一个终端中同时使用多个程序和 shell,类似于窗口管理器 - 提高工作效率,实现复杂的终端工作流管理 ### C. 学完能做什么 - 在 tmux 中创建和管理多个会话、窗口和面板 - 在不同位置之间无缝切换工作环境 - 实现程序的持久化运行,不受网络断线影响 - 高效利用终端空间,进行多任务并行操作 ## 2. 前置知识 ### A. 必备技能 - 熟悉基本 Linux/Unix 命令行操作 - 了解 ssh 远程登录 - 理解终端和 shell 的基本概念 ### B. 推荐知识 - 了解进程管理概念 - 熟悉 vim 或 emacs 编辑器(用于后续配置) # 二、环境准备 ## 1. 系统要求 - Linux:Ubuntu、Debian、CentOS、RHEL 等 - macOS:10.15 及以上版本 - BSD:OpenBSD、FreeBSD 等 ## 2. 安装步骤 ### Ubuntu/Debian ```bash sudo apt update sudo apt install tmux ``` ### macOS ```bash brew install tmux ``` ### CentOS/RHEL ```bash sudo yum install tmux ``` ### 从源码编译 访问 https://github.com/tmux/tmux/wiki/Installing 获取详细编译安装指南。 ## 3. 验证安装 ```bash tmux -V ``` # 三、核心概念 ## 1. 基本术语 ### tmux 服务器和客户端 - tmux 服务器:单个主进程,在后台运行,管理 tmux 内的所有程序 - 客户端:连接到服务器的终端实例,通过 /tmp 目录下的套接字文件通信 ### 层次结构 ``` tmux 服务器 ├── 会话 (Session) └── 窗口 (Window) └── 面板 (Pane) └── 终端 + 运行的程序 ``` ## 2. 工作原理 ```mermaid graph TB subgraph 外部终端 A[客户端1] B[客户端2] end subgraph tmux服务器 C[会话1] D[会话2] E[窗口1] F[窗口2] G[面板1] H[面板2] end A -->|附加| C B -->|附加| C C --> E C --> F E --> G E --> H ```  ## 3. 术语汇总表 | 术语 | 描述 | |------|------| | Client | 从外部终端(如 xterm)附加 tmux 会话 | | Session | 将一个或多个窗口分组在一起 | | Window | 将一个或多个面板分组在一起,链接到一个或多个会话 | | Pane | 包含终端和运行程序,出现在一个窗口中 | | Active pane | 当前窗口中输入被发送的面板,每个窗口一个 | | Current window | 附加会话中显示的窗口,每个会话一个 | | Last window | 上一个当前窗口 | | Window layout | 窗口中面板的大小和位置 | # 四、快速上手 ## 1. 创建第一个会话 ### 基本创建 ```bash tmux new ``` 这会创建一个新会话并自动附加。第一个会话默认命名为"0",第二个为"1",以此类推。 ### 命名会话 ```bash tmux new -s mysession ``` ### 运行特定命令 ```bash tmux new 'emacs ~/.tmux.conf' ``` 或使用: ```bash tmux new -- emacs ~/.tmux.conf ``` ### 命名窗口 ```bash tmux new -n mytopwindow top ``` ## 2. 状态行说明 当 tmux 客户端附加时,屏幕底部会显示绿色状态行,包含: - 左侧:附加会话的名称,如 [0] - 中间:会话中的窗口列表,显示索引和名称,如 0:ksh - 右侧:面板标题(引号中)、时间和日期 在窗口列表中: - 当前窗口用 * 标记 - 上一个窗口用 - 标记 - 窗口过多时会出现 < 或 > 表示有隐藏窗口 ## 3. 前缀键 tmux 使用前缀键(prefix key)来区分发送给程序的输入和控制 tmux 的命令。 ### 默认前缀键 默认前缀键是 C-b(Ctrl+b),表示同时按 Ctrl 和 b 键。 ### 修饰键表示 - C-:Control 键 - M-:Meta 键(现代计算机上通常是 Alt) - S-:Shift 键 这些可以组合使用,例如 C-M-x 表示同时按 Ctrl、Alt 和 x。 ### 使用示例 ``` C-b c 表示:按 Ctrl+b,释放后按 c C-b C-c 表示:按住 Ctrl,同时按 b 和 c ``` 按两次 C-b 会将 C-b 发送到活动面板的程序。 ## 4. 获取帮助 ### 查看所有键绑定 按 C-b ? 进入查看模式,显示所有键绑定及其说明。 ### 查看单个键说明 按 C-b / 然后按任意键查看该键的说明。 ### 从命令行查看 ```bash tmux lsk -N | more ``` ## 5. 附加和分离 ### 分离会话 按 C-b d 分离会话,返回 shell,tmux 会话和程序继续在后台运行。 ### 重新附加 ```bash # 附加到最近使用的会话 tmux attach # 附加到指定会话 tmux attach -t mysession # 附加并分离其他客户端 tmux attach -dt mysession ``` ### 智能附加 ```bash # 会话存在则附加,不存在则创建 tmux new -As mysession ``` ## 6. 列出会话 ```bash tmux ls ``` 输出示例: ``` 1: 3 windows (created Sat Feb 22 11:44:51 2020) 2: 1 windows (created Sat Feb 22 11:44:51 2020) mysession: 1 windows (created Sat Feb 22 11:44:51 2020) ``` # 五、窗口和面板操作 ## 1. 创建新窗口 ### 键盘快捷键 - C-b c:创建新窗口(成为当前窗口) ### 命令提示符方式 ```bash # 创建窗口但不切换 :neww -d mynewwindow # 在指定索引创建窗口 :neww -t999 # 运行特定命令 :neww top ``` ## 2. 分割窗口(创建面板) ### 水平分割 C-b % 将当前面板水平分割为左右两个面板。 ### 垂直分割 C-b " 将当前面板垂直分割为上下两个面板。 ### 命令选项 ```bash # -h 水平分割,-v 垂直分割 :split-window -h # -d 不改变活动面板 :split-window -d # -f 新面板跨整个窗口宽度或高度 :split-window -f # -b 将新面板放在左侧或上方 :split-window -b ``` ## 3. 切换窗口 | 快捷键 | 功能 | |--------|------| | C-b 0 到 C-b 9 | 切换到窗口 0-9 | | C-b ' | 提示输入窗口索引并切换 | | C-b n | 切换到下一个窗口 | | C-b p | 切换到上一个窗口 | | C-b l | 切换到最后一个窗口 | ## 4. 切换面板 | 快捷键 | 功能 | |--------|------| | C-b Up/Down/Left/Right | 切换到上/下/左/右侧面板 | | C-b q | 短暂显示面板编号,按数字键切换 | | C-b o | 按面板编号移动到下一个面板 | | C-b C-o | 与下一个面板交换位置 | ## 5. 调整面板大小 ### 小步调整 C-b C-Left/Right/Up/Down ### 大步调整 C-b M-Left/Right/Up/Down ### 缩放面板 C-b z 将活动面板临时放大占满整个窗口,再次按恢复原状。 ## 6. 窗口布局 ### 切换布局 C-b Space 在预设布局之间循环切换。 ### 直接选择布局 - C-b M-1:even-horizontal(水平均匀分布) - C-b M-2:even-vertical(垂直均匀分布) - C-b M-3:main-horizontal(一个大面板在顶部,其余水平分布) - C-b M-4:main-vertical(一个大面板在左侧,其余垂直分布) - C-b M-5:tiled(平铺布局) ```mermaid graph TB subgraph 预设布局类型 A[even-horizontal] B[even-vertical] C[main-horizontal] D[main-vertical] E[tiled] end A --> F[C-b M-1] B --> G[C-b M-2] C --> H[C-b M-3] D --> I[C-b M-4] E --> J[C-b M-5] ```  # 六、高级功能 ## 1. 树模式(Tree Mode) 树模式用于浏览和选择会话、窗口和面板。 ### 进入树模式 - C-b s:仅显示会话,选中当前附加的会话 - C-b w:展开显示会话和窗口,选中当前窗口 ### 树模式操作 | 键 | 功能 | |----|------| | Enter | 切换到选中项 | | Up/Down | 选择上一项/下一项 | | Right | 展开项 | | Left | 折叠项 | | t | 标记/取消标记项 | | x | 杀死选中项 | | X | 杀死所有标记项 | | q | 退出树模式 | ## 2. 客户端模式 查看和管理附加到 tmux 的客户端。 ### 进入客户端模式 C-b D(即 C-b S-d) ### 客户端模式操作 | 键 | 功能 | |----|------| | Enter | 分离选中的客户端 | | d | 分离选中的客户端 | | D | 分离所有标记的客户端 | | x | 分离并尝试杀死启动客户端的 shell | ## 3. 复制和粘贴 ### 进入复制模式 C-b [ 进入复制模式,冻结面板输出。 ### emacs 风格按键 | 键 | 功能 | |----|------| | Up/Down/Left/Right | 移动光标 | | C-Space | 开始选择 | | C-w | 复制选择并退出 | | q | 退出复制模式 | | C-a/e | 移动到行首/行尾 | | C-r | 向后搜索 | | M-f/b | 移动到下一个/上一个单词 | ### 粘贴 - C-b ]:粘贴最近复制的文本 - C-b =:进入缓冲区模式,选择历史缓冲区粘贴 ### 缓冲区管理 ```bash # 重命名缓冲区 :setb -bbuffer0 -nmybuffer # 创建新缓冲区 :setb -bfoo bar # 从文件加载 :loadb -bbuffername ~/file.txt # 保存到文件 :saveb -bbuffer0 ~/saved_buffer ``` ## 4. 查找功能 C-b f 提示输入文本,然后进入树模式,仅显示包含该文本的面板。 ## 5. 鼠标支持 ### 启用鼠标 ```bash :set -g mouse on ``` ### 鼠标操作 - 左键点击面板:切换活动面板 - 左键点击状态栏窗口名:切换当前窗口 - 拖动面板边框:调整面板大小 - 在面板内拖动:选择文本 - 右键点击:打开命令菜单 # 七、配置 tmux ## 1. 配置文件 ### 文件位置 ~/.tmux.conf ### 重要说明 配置文件仅在 tmux 服务器启动时执行,而非创建新会话时。 ### 重新加载配置 ```bash :source ~/.tmux.conf ``` ## 2. 配置文件语法 ### 基本规则 - 每行一个命令 - 以 # 开头的行是注释 - 支持引号和转义 ### 示例配置 ```bash # 这是注释 set -g status off # 参数可以用引号包含空格 set -g status-left "hello word" # 或使用转义 set -g status-left hello\ word # 波浪号展开为家目录 source ~/myfile # 环境变量 MYFILE=myfile source "~/$MYFILE" ``` ## 3. 键绑定配置 ### 键表(Key Tables) - root:无前缀键的键绑定 - prefix:前缀键后的键绑定 - copy-mode:emacs 风格复制模式键绑定 - copy-mode-vi:vi 风格复制模式键绑定 ### 绑定新键 ```bash # 在配置文件中 bind M-0 selectw -t:=10 # 解除绑定 unbind M-0 ``` ### 更改前缀键 ```bash # 将前缀键改为 C-a unbind C-b set -g prefix C-a bind C-a send-prefix ``` ## 4. 常用配置示例 ```bash # 基本设置 set -g default-terminal "screen-256color" set -g history-limit 10000 set -g mouse on # 状态栏设置 set -g status-interval 1 set -g status-justify centre set -g status-left-length 100 set -g status-right-length 60 # 窗口和面板索引从 1 开始 set -g base-index 1 setw -g pane-base-index 1 # 自动重命名窗口 setw -g automatic-rename on # 更容易的键绑定 bind c new-window -c "#{pane_current_path}" bind '"' split-window -c "#{pane_current_path}" bind % split-window -h -c "#{pane_current_path}" ``` # 八、常用命令速查 ## 1. 会话管理 | 命令 | 功能 | |------|------| | tmux new -s name | 创建命名会话 | | tmux ls | 列出所有会话 | | tmux attach -t name | 附加到指定会话 | | tmux kill-session -t name | 杀死指定会话 | | tmux kill-server | 杀死 tmux 服务器 | ## 2. 窗口管理 | 命令 | 功能 | |------|------| | :neww | 创建新窗口 | | :neww -n name | 创建命名窗口 | | :selectw -t n | 切换到窗口 n | | :movew -t n | 移动窗口到索引 n | | :killw | 杀死当前窗口 | ## 3. 面板管理 | 命令 | 功能 | |------|------| | :split-window | 水平分割 | | :split-window -h | 垂直分割 | | :selectp -t n | 选择面板 n | | :killp | 杀死当前面板 | | :resize-pane -D 10 | 向下调整 10 行 | ## 4. 配置命令 | 命令 | 功能 | |------|------| | :set option value | 设置选项 | | :set -g option value | 设置全局选项 | | :show-options | 显示选项 | | :list-keys | 列出键绑定 | # 九、实战案例 ## 1. 远程服务器开发环境 ### 场景描述 在远程服务器上进行开发,需要同时运行编辑器、编译器和多个 shell。 ### 操作步骤 1. ssh 连接到远程服务器 2. 启动 tmux:tmux new -s dev 3. 第一个窗口运行编辑器:vim main.c 4. C-b c 创建新窗口运行编译器 5. C-b " 垂直分割,上半部分运行测试 6. C-b d 分离会话,下班回家 7. 从家里重新连接:ssh server && tmux attach -t dev ### 效果 - 工作状态完全保留 - 不受网络断线影响 - 多处无缝切换 ## 2. 监控多台服务器 ### 场景描述 同时监控多台服务器的系统状态。 ### 操作步骤 1. 创建 tmux 会话:tmux new -s monitor 2. C-b % 垂直分割为多个面板 3. 在每个面板中 ssh 到不同服务器 4. 每个面板运行 top 或 htop 5. C-b Space 切换不同布局视图 ## 3. 配置文件模板 ### 完整 ~/.tmux.conf ```bash # === 基本设置 === set -g default-terminal "screen-256color" set -g history-limit 20000 set -g mouse on set -g renumber-windows on set -g set-titles on set -g set-titles-string "#T" # === 前缀键 === unbind C-b set -g prefix C-a bind C-a send-prefix # === 索引从 1 开始 === set -g base-index 1 setw -g pane-base-index 1 # === 状态栏 === set -g status on set -g status-interval 1 set -g status-justify left set -g status-left '[#S] ' set -g status-left-length 20 set -g status-right '%Y-%m-%d %H:%M:%S' set -g status-right-length 30 # === 窗口 === setw -g automatic-rename on setw -g monitor-activity on set -g visual-activity on # === 面板 === setw -g pane-border-status top setw -g pane-border-format "#{pane_index} #{pane_current_command}" # === 键绑定 === bind c new-window -c "#{pane_current_path}" bind '"' split-window -c "#{pane_current_path}" bind % split-window -h -c "#{pane_current_path}" bind -n M-Left selectw -t :- bind -n M-Right selectw -t :+ bind -n M-Up selectp -t :- bind -n M-Down selectp -t :+ # === 复制模式(vi 风格)=== setw -g mode-keys vi bind -T copy-mode-vi v send-keys -X begin-selection bind -T copy-mode-vi y send-keys -X copy-pipe "xclip -selection clipboard" ``` # 十、常见问题 ## 1. 安装问题 ### 问题:版本过旧 某些旧版本 tmux 功能受限。解决方案: ```bash # 添加 PPA(Ubuntu) sudo add-apt-repository ppa:pi-rho/dev sudo apt update sudo apt install tmux ``` ### 问题:编译失败 确保安装了依赖: ```bash sudo apt install libevent-dev ncurses-dev ``` ## 2. 配置问题 ### 问题:配置不生效 配置文件只在服务器启动时读取。解决方案: ```bash # 杀死服务器重启 tmux kill-server tmux new # 或在运行时重新加载 :source ~/.tmux.conf ``` ## 3. 使用问题 ### 问题:滚动查看历史 C-b [ 进入复制模式,然后用方向键或 PageUp/PageDown 滚动。 ### 问题:复制到系统剪贴板 安装 xclip 并配置: ```bash bind -T copy-mode-vi y send-keys -X copy-pipe "xclip -selection clipboard" ``` ## 4. 性能问题 ### 问题:历史记录过多导致内存占用 限制历史记录: ```bash set -g history-limit 5000 ``` # 十一、进阶技巧 ## 1. 会话脚本化 ### 启动复杂工作环境 创建脚本 ~/scripts/dev.sh: ```bash #!/bin/bash SESSION="dev" # 检查会话是否已存在 tmux has-session -t $SESSION 2>/dev/null if [ $? != 0 ]; then # 创建新会话 tmux new-session -d -s $SESSION -n "editor" # 创建其他窗口 tmux new-window -t $SESSION -n "shell" tmux new-window -t $SESSION -n "logs" tmux new-window -t $SESSION -n "monitor" # 在 editor 窗口分割面板 tmux split-window -t $SESSION:editor -h -p 30 # 发送命令到面板 tmux send-keys -t $SESSION:editor.left "vim" C-m tmux send-keys -t $SESSION:editor.right "ls -la" C-m fi # 附加到会话 tmux attach-session -t $SESSION ``` ## 2. 自动化运维 ### 批量操作服务器 ```bash #!/bin/bash SERVERS=("server1" "server2" "server3") SESSION="ops" tmux new-session -d -s $SESSION for server in "${SERVERS[@]}"; do tmux split-window -t $SESSION -h tmux send-keys -t $SESSION "ssh $server" C-m done # 关闭第一个空面板 tmux kill-pane -t $SESSION:0.0 tmux select-layout -t $SESSION tiled tmux attach -t $SESSION ``` ## 3. 集成其他工具 ### 与 fzf 集成 ```bash # 模糊搜索会话 bind s run-shell "tmux list-sessions | fzf | cut -d: -f1 | xargs tmux switch-client -t" # 模糊搜索窗口 bind w run-shell "tmux list-windows | fzf | cut -d: -f1 | xargs tmux select-window -t" ``` # 十二、最佳实践 ## 1. 命名规范 - 使用有意义的会话名:dev、test、monitor - 使用描述性的窗口名:editor、logs、db - 为长期工作创建专用会话 ## 2. 工作流建议 - 为不同项目使用不同会话 - 为不同环境使用不同会话(开发、测试、生产) - 定期清理不用的会话 ## 3. 配置管理 - 将配置文件纳入版本控制 - 不同环境使用不同配置文件 - 使用条件语句加载不同配置 ## 4. 安全建议 - 不要在会话中保存敏感信息 - 定期更新 tmux 版本 - 谨慎使用自动执行命令 # 十三、参考资料 *** ## 参考资料 1. [tmux GitHub Repository](https://github.com/tmux/tmux) 2. [tmux Getting Started Guide](https://github.com/tmux/tmux/wiki/Getting-Started) 3. [OpenBSD tmux Manual](https://man.openbsd.org/tmux) 4. [tmux FAQ](https://github.com/tmux/tmux/wiki/FAQ) 最后修改:2026 年 01 月 19 日 © 允许规范转载 赞 如果觉得我的文章对你有用,请随意赞赏