linux tmux命令

简介:tmux(Terminal Multiplexer)是一个终端复用器,允许用户在单个终端窗口中创建多个终端会话、窗口和面板。tmux会话可以保持后台运行,即使用户断开SSH连接,会话中的任务也不会中断。
tmux的核心概念
会话 (Session)

一组窗口的集合,可后台运行

窗口 (Window)

屏幕上的一个完整视图

面板 (Pane)

窗口分割出的子区域

快捷键

Ctrl+b 前缀键操作

语法格式

tmux [命令] [选项]
tmux [命令] [目标] [参数]

常用命令

命令 说明
tmux 新建一个会话
tmux new -s 会话名 创建指定名称的会话
tmux ls 列出所有会话
tmux attach -t 会话名 附加到指定会话
tmux kill-session -t 会话名 关闭指定会话
tmux rename-session -t 旧名 新名 重命名会话
tmux source-file 配置文件 重新加载配置文件

快捷键速查表

常用快捷键(前缀键:Ctrl+b)
会话操作
  • d - 分离当前会话
  • s - 列出所有会话
  • $ - 重命名当前会话
  • ( - 切换到上一个会话
  • ) - 切换到下一个会话
窗口操作
  • c - 创建新窗口
  • n - 切换到下一个窗口
  • p - 切换到上一个窗口
  • <数字> - 切换到指定窗口
  • , - 重命名当前窗口
  • & - 关闭当前窗口
面板操作
  • % - 垂直分割面板
  • " - 水平分割面板
  • 方向键 - 在面板间移动
  • o - 切换到下一个面板
  • x - 关闭当前面板
  • z - 最大化/恢复面板

使用示例

示例1:基础会话管理
# 启动新会话(自动命名)
tmux

# 启动新会话并命名
tmux new -s mysession

# 列出所有会话
tmux ls
# 或
tmux list-sessions

# 附加到指定会话
tmux attach -t mysession
# 简写:
tmux a -t mysession

# 从会话中分离(在tmux内按Ctrl+b然后按d)
# 在tmux外关闭会话
tmux kill-session -t mysession

# 重命名会话
tmux rename-session -t oldname newname
示例2:窗口管理
# 创建带特定名称的会话和窗口
tmux new -s dev -n editor

# 在tmux内(按Ctrl+b后):
# c - 创建新窗口
# n - 下一个窗口
# p - 上一个窗口
# 0-9 - 切换到指定编号窗口
# , - 重命名当前窗口
# & - 关闭当前窗口

# 从命令行管理窗口
# 在会话中创建新窗口
tmux new-window -t dev -n "logs"
# 在指定会话中执行命令
tmux send-keys -t dev:1 "tail -f /var/log/syslog" C-m
tmux窗口示例

图:tmux多窗口界面示例

示例3:面板分割和管理
# 在tmux内分割面板:
# % - 垂直分割(左右)
# " - 水平分割(上下)
# 方向键 - 在面板间移动
# o - 切换到下一个面板
# x - 关闭当前面板
# z - 最大化/恢复当前面板
# q - 显示面板编号
# 按住Ctrl同时拖拽 - 调整面板大小

# 从命令行分割面板
tmux split-window -h  # 垂直分割
tmux split-window -v  # 水平分割

# 创建复杂布局示例
tmux new -s workspace
# 然后按Ctrl+b % 垂直分割
# 按Ctrl+b " 水平分割右边面板
# 按Ctrl+b 方向键 在不同面板间移动
tmux面板分割示例

图:tmux多面板工作区示例

示例4:高级功能和配置
# 1. 复制模式(类似vim)
# Ctrl+b [ - 进入复制模式
# 空格 - 开始选择
# 回车 - 复制选中内容
# Ctrl+b ] - 粘贴

# 2. 同步输入到所有面板
# Ctrl+b :setw synchronize-panes

# 3. 从文件加载配置
tmux source-file ~/.tmux.conf

# 4. 会话恢复脚本
#!/bin/bash
tmux new-session -d -s dev -n editor
tmux send-keys -t dev:editor "vim" C-m
tmux split-window -h -t dev:editor
tmux send-keys -t dev:editor.1 "htop" C-m
tmux attach -t dev

# 5. 在tmux中运行命令
tmux new-window -t mysession -n "monitor"
tmux send-keys -t mysession:monitor "watch -n 1 'free -h'" C-m

配置文件示例

~/.tmux.conf 配置示例
# ~/.tmux.conf - tmux配置文件

# 设置前缀键为Ctrl+a(可选)
# set-option -g prefix C-a
# unbind-key C-b
# bind-key C-a send-prefix

# 设置终端颜色支持
set -g default-terminal "screen-256color"
set -ga terminal-overrides ",xterm-256color:Tc"

# 设置状态栏
set -g status-interval 1
set -g status-justify centre
set -g status-left-length 20
set -g status-right-length 50
set -g status-left "#[fg=green][#S]"
set -g status-right "#[fg=yellow]%H:%M:%S #[fg=magenta]%Y-%m-%d"

# 设置面板颜色
set -g pane-border-style fg=colour240
set -g pane-active-border-style fg=green

# 启用鼠标支持
set -g mouse on

# 设置窗口编号从1开始
set -g base-index 1
setw -g pane-base-index 1

# 重新加载配置文件快捷键
bind-key r source-file ~/.tmux.conf \; display "配置文件已重新加载"

# 分割面板快捷键(更容易记忆)
bind-key | split-window -h
bind-key - split-window -v

# 快速窗口切换
bind-key -n M-Left previous-window
bind-key -n M-Right next-window

# 调整面板大小
bind-key -r H resize-pane -L 5
bind-key -r J resize-pane -D 5
bind-key -r K resize-pane -U 5
bind-key -r L resize-pane -R 5

# 复制模式使用vim风格
setw -g mode-keys vi
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi y send-keys -X copy-selection

# 设置历史记录行数
set -g history-limit 10000

实战应用场景

场景1:服务器管理会话
远程服务器上的持久会话管理:
#!/bin/bash
# server_manager.sh - 服务器管理tmux会话

SESSION="server-mgmt"

# 检查会话是否已存在
if tmux has-session -t $SESSION 2>/dev/null; then
    echo "会话 $SESSION 已存在,正在附加..."
    tmux attach -t $SESSION
else
    echo "创建新会话: $SESSION"

    # 创建新会话
    tmux new-session -d -s $SESSION -n "main"

    # 第一个窗口:系统监控
    tmux send-keys -t $SESSION:main "echo '=== 系统监控 ==='" C-m
    tmux send-keys -t $SESSION:main "htop" C-m
    tmux split-window -v -t $SESSION:main
    tmux send-keys -t $SESSION:main.1 "watch -n 2 'df -h | grep -v loop'" C-m

    # 第二个窗口:日志监控
    tmux new-window -t $SESSION -n "logs"
    tmux send-keys -t $SESSION:logs "tail -f /var/log/syslog" C-m
    tmux split-window -h -t $SESSION:logs
    tmux send-keys -t $SESSION:logs.1 "tail -f /var/log/auth.log" C-m

    # 第三个窗口:维护工具
    tmux new-window -t $SESSION -n "tools"
    tmux send-keys -t $SESSION:tools "echo '常用维护命令:'" C-m
    tmux send-keys -t $SESSION:tools "echo '1. 磁盘检查: df -h'" C-m
    tmux send-keys -t $SESSION:tools "echo '2. 内存使用: free -h'" C-m
    tmux send-keys -t $SESSION:tools "echo '3. 进程查看: ps aux | head -20'" C-m

    # 附加到会话
    tmux attach -t $SESSION
fi
场景2:开发环境配置
编程开发工作区设置:
#!/bin/bash
# dev_workspace.sh - 开发环境tmux配置

PROJECT_NAME=${1:-"myproject"}
SESSION="$PROJECT_NAME-dev"

if tmux has-session -t $SESSION 2>/dev/null; then
    tmux attach -t $SESSION
else
    # 创建开发会话
    tmux new-session -d -s $SESSION -n "editor"

    # 编辑器窗口
    tmux send-keys -t $SESSION:editor "cd ~/projects/$PROJECT_NAME" C-m
    tmux send-keys -t $SESSION:editor "vim" C-m

    # 分割右侧面板用于测试/运行
    tmux split-window -h -p 30 -t $SESSION:editor
    tmux send-keys -t $SESSION:editor.1 "cd ~/projects/$PROJECT_NAME" C-m
    tmux send-keys -t $SESSION:editor.1 "echo '测试面板 - 按需使用'" C-m

    # 创建第二个窗口:版本控制
    tmux new-window -t $SESSION -n "git"
    tmux send-keys -t $SESSION:git "cd ~/projects/$PROJECT_NAME" C-m
    tmux send-keys -t $SESSION:git "git status" C-m

    # 创建第三个窗口:文档/笔记
    tmux new-window -t $SESSION -n "docs"
    tmux send-keys -t $SESSION:docs "cd ~/projects/$PROJECT_NAME/docs" C-m
    tmux send-keys -t $SESSION:docs "ls -la" C-m

    # 创建第四个窗口:数据库
    tmux new-window -t $SESSION -n "database"
    tmux send-keys -t $SESSION:database "mysql -u root -p" C-m

    # 设置初始活动窗口
    tmux select-window -t $SESSION:editor

    # 附加到会话
    tmux attach -t $SESSION
fi
场景3:网络监控面板
#!/bin/bash
# network_monitor.sh - 网络监控tmux面板

SESSION="network-monitor"

tmux new-session -d -s $SESSION -n "dashboard"

# 左上:带宽监控
tmux split-window -h -t $SESSION:dashboard
tmux send-keys -t $SESSION:dashboard.0 "iftop" C-m

# 右上:连接监控
tmux split-window -v -t $SESSION:dashboard.1
tmux send-keys -t $SESSION:dashboard.2 "nload" C-m

# 左下:端口监控
tmux split-window -v -t $SESSION:dashboard.0
tmux send-keys -t $SESSION:dashboard.3 "watch -n 1 'netstat -tulpn | grep -v \"127.0.0.1\"'" C-m

# 右下:Ping测试
tmux split-window -h -t $SESSION:dashboard.3
tmux send-keys -t $SESSION:dashboard.4 "ping 8.8.8.8" C-m

# 调整面板大小
tmux select-pane -t $SESSION:dashboard.0
tmux resize-pane -R 20
tmux resize-pane -D 10

# 创建第二个窗口:详细日志
tmux new-window -t $SESSION -n "logs"
tmux send-keys -t $SESSION:logs "sudo tcpdump -i any -n" C-m

# 附加到会话
tmux attach -t $SESSION
tmux的优势
  • 会话持久化,断开连接不中断任务
  • 多窗口、多面板提高工作效率
  • 高度可定制,支持丰富配置
  • 支持脚本自动化
  • 强大的复制粘贴功能
  • 可共享会话(结对编程)
  • 资源占用低,性能好
注意事项
  • 需要时间适应快捷键
  • 配置文件可能因版本而异
  • 嵌套tmux会话可能产生冲突
  • 某些程序可能不兼容
  • 需要定期清理无用会话
  • 鼠标支持可能需要配置
  • 远程连接中断可能导致会话卡住
使用技巧和小贴士
提高效率的技巧:
# 1. 快速创建开发环境
tmuxinator  # 第三方工具,管理tmux配置模板

# 2. 会话自动保存和恢复
# 使用tmux-resurrect插件:
# 保存:prefix + Ctrl-s
# 恢复:prefix + Ctrl-r

# 3. 快速跳转到最近使用的窗口
# 在配置文件中添加:
bind-key C-a last-window

# 4. 使用鼠标切换面板(需要配置)
# 在~/.tmux.conf中添加:
set -g mouse on

# 5. 复制文本到系统剪贴板(需要配置)
# Linux安装xclip后:
bind-key -T copy-mode-vi y send-keys -X copy-pipe "xclip -i -sel clipboard"

# 6. 同时向所有面板发送命令
# 进入命令模式(prefix + :)然后输入:
setw synchronize-panes on
# 关闭同步:
setw synchronize-panes off

# 7. 快速重命名会话
# 在tmux内:prefix + $
# 命令行:tmux rename-session -t oldname newname

# 8. 保存tmux布局到文件
tmux list-windows -F "#{window_layout}" > layout.txt
# 恢复布局(需要脚本支持)
常见问题解答
Q: 如何安装tmux?
# Ubuntu/Debian
sudo apt install tmux

# RHEL/CentOS
sudo yum install tmux

# Fedora
sudo dnf install tmux

# macOS (Homebrew)
brew install tmux

# 从源码编译
git clone https://github.com/tmux/tmux.git
cd tmux
sh autogen.sh
./configure && make
sudo make install

# 检查版本
tmux -V
Q: tmux和screen有什么区别?

A: 主要区别:

特性 tmux screen
开发状态 活跃开发,现代 维护模式,稳定
配置方式 配置文件,易读性强 配置文件较复杂
面板分割 内置支持,操作方便 需要插件或复杂配置
状态栏 高度可定制 定制性有限
插件系统 丰富的插件生态 插件较少
学习曲线 适中 较陡峭
Q: 如何解决tmux中的颜色显示问题?
# 1. 在~/.tmux.conf中添加:
set -g default-terminal "screen-256color"
set -ga terminal-overrides ",xterm-256color:Tc"

# 2. 确保终端支持256色
echo $TERM

# 3. 对于特定程序(如vim),可能需要额外配置
# 在~/.vimrc中添加:
if &term =~ 'screen' || &term =~ 'tmux'
    set term=xterm-256color
endif

# 4. 检查颜色支持
# 运行颜色测试脚本
curl -s https://gist.githubusercontent.com/lifepillar/09a44b8cf0f9397465614e622979107f/raw/24-bit-color.sh | bash
Q: 如何共享tmux会话(结对编程)?
# 方法1:使用socket(同一台机器)
# 用户A创建会话:
tmux -S /tmp/pairing new -s pair-session

# 用户B加入会话(需要读取权限):
tmux -S /tmp/pairing attach -t pair-session

# 设置socket权限:
chmod 777 /tmp/pairing

# 方法2:使用SSH隧道(不同机器)
# 在服务器上创建会话:
tmux new -s shared

# 客户端通过SSH连接:
ssh -t user@server "tmux attach -t shared"

# 方法3:使用tmate(tmux的分支,专为共享设计)
# 安装tmate后:
tmate
# 显示连接命令供其他人使用
相关工具和插件
工具/插件 用途 说明
tmuxinator 会话管理模板 创建和管理复杂的tmux会话配置
tmux-resurrect 会话保存/恢复 保存tmux会话状态,重启后可恢复
tmux-continuum 自动保存 自动保存和恢复tmux会话
tpm 插件管理器 tmux插件管理器
screen 传统终端复用器 tmux的替代品,功能较少但稳定
byobu 增强包装 基于tmux或screen的增强终端
tmate 共享会话 tmux分支,专为会话共享设计