| name | terminal-session |
| description | tmux 持久化终端会话控制。通过向 tmux 发送按键、读取输出,管理 Claude Code、Codex、SSH 等长时间运行的交互式进程。跨多轮对话保持进程状态。需预装 tmux(Linux/macOS 默认提供;Windows 用户需 WSL2)。 |
终端会话控制(tmux)
本技能完全通过已有的 exec 工具调用系统级 tmux CLI,无需任何新工具或依赖。
使用时机
✅ 应当使用本技能的场景
- 监控 Claude Code / Codex 在 tmux 中的运行状态
- 向交互式终端程序发送输入(回答提示、选择选项)
- 读取 tmux 中长时间运行进程的输出
- 跨多轮对话操作同一个后台进程
- 检查已有 tmux 会话中的后台任务进度
❌ 不应使用本技能的场景
- 一次性 shell 命令(ls、grep、python script.py 等)→ 直接用
exec
- 启动新后台进程(无需交互)→ 用
exec 执行命令(末尾加 &)
- 非交互式脚本 → 直接用
exec
- 进程不在 tmux 中 → 无法操作
- 创建新 tmux 会话 → 用
exec 执行 tmux new-session(本技能专注于操控已有会话)
- Windows 原生(无 WSL) → tmux 不可用,告知用户需要 WSL2
常用会话名称约定
| 会话名 | 用途 |
|---|
shared | 主交互会话 |
worker-2 ~ worker-8 | 并行工作会话 |
ssh_prod | 生产环境 SSH |
claude_task | Claude Code 任务会话 |
常用命令
列出会话
tmux list-sessions
tmux ls
读取输出
tmux capture-pane -t shared -p | tail -20
tmux capture-pane -t shared -p -S -
tmux capture-pane -t shared:0.0 -p
发送输入
tmux send-keys -t shared "hello"
tmux send-keys -t shared "ls -la" Enter
tmux send-keys -t shared Enter
tmux send-keys -t shared Escape
tmux send-keys -t shared C-c
tmux send-keys -t shared C-d
tmux send-keys -t shared C-z
窗口 / 面板导航
tmux select-window -t shared:0
tmux select-pane -t shared:0.1
tmux list-windows -t shared
会话管理
tmux new-session -d -s newsession
tmux new-session -d -s claude_task 'claude-code /workspace/project'
tmux kill-session -t sessionname
tmux rename-session -t old new
tmux has-session -t my_session 2>/dev/null && echo "存在" || echo "不存在"
安全发送输入(重要)
对于交互式 TUI 程序(Claude Code、Codex 等),必须将文本和 Enter 拆开发送,避免多行粘贴导致的异常:
tmux send-keys -t shared -l -- "Please apply the patch in src/foo.ts"
sleep 0.1
tmux send-keys -t shared Enter
tmux send-keys -t shared "Please apply the patch in src/foo.ts" Enter
Claude Code 会话操作模式
检查会话是否在等待输入
tmux capture-pane -t worker-3 -p | tail -10 | grep -E "❯|Yes.*No|proceed|permission|approve"
确认 Claude Code 提示
tmux send-keys -t worker-3 'y' Enter
tmux send-keys -t worker-3 '2' Enter
向会话发送任务
tmux send-keys -t worker-4 -l -- "Fix the authentication bug in auth.js"
sleep 0.1
tmux send-keys -t worker-4 Enter
批量检查所有工作会话状态
for s in shared worker-2 worker-3 worker-4 worker-5 worker-6 worker-7 worker-8; do
echo "=== $s ==="
tmux capture-pane -t $s -p 2>/dev/null | tail -5
done
完整工作流示例
启动 Claude Code 并交互
tmux new-session -d -s coder 'claude-code /workspace'
sleep 3 && tmux capture-pane -t coder -p | tail -20
tmux send-keys -t coder -l -- "Refactor the auth module to use JWT tokens"
sleep 0.1
tmux send-keys -t coder Enter
sleep 10 && tmux capture-pane -t coder -p -S -100
tmux capture-pane -t coder -p | tail -5 | grep -q "proceed" && \
tmux send-keys -t coder 'y' Enter
tmux kill-session -t coder
SSH 远程操作
tmux new-session -d -s ssh_prod 'ssh -o StrictHostKeyChecking=no user@10.0.0.1'
sleep 2 && tmux capture-pane -t ssh_prod -p | tail -5
tmux send-keys -t ssh_prod 'df -h && free -m' Enter
sleep 2 && tmux capture-pane -t ssh_prod -p | tail -20
注意事项
capture-pane 必须加 -p 才会输出到 stdout(脚本中必须)
-S - 读取完整滚动历史;-S -200 读取最近 200 行
- 目标格式:
会话:窗口.面板(如 shared:0.0)
- tmux 会话在 SSH 断开后依然存活,无需重新连接
- 任务完成后务必
kill-session,防止僵尸进程堆积
exec 工具的安全策略仍然有效,危险命令仍会被拦截