tmux远程控制技能Skill tmux

这个技能利用 tmux 实现远程控制交互式命令行界面(CLI),通过发送按键命令和捕获窗格输出,支持自动化任务、多会话管理、并行运行编码代理等应用场景。关键词:tmux, 远程控制, CLI, 自动化, 会话管理, 窗格输出, 编码代理。

DevOps 0 次安装 0 次浏览 更新于 3/24/2026

name: tmux description: 通过发送按键和抓取窗格输出来远程控制 tmux 会话以进行交互式 CLI。 metadata: { “otto”: { “emoji”: “🧵”, “os”: [“darwin”, “linux”], “requires”: { “bins”: [“tmux”] } } }

tmux 技能 (Otto)

仅在需要交互式 TTY 时使用 tmux。对于长时间运行的非交互式任务,优先使用 exec 后台模式。

快速入门(隔离的套接字,执行工具)

SOCKET_DIR="${OTTO_TMUX_SOCKET_DIR:-${TMPDIR:-/tmp}/otto-tmux-sockets}"
mkdir -p "$SOCKET_DIR"
SOCKET="$SOCKET_DIR/otto.sock"
SESSION=otto-python

tmux -S "$SOCKET" new -d -s "$SESSION" -n shell
tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -- 'PYTHON_BASIC_REPL=1 python3 -q' Enter
tmux -S "$SOCKET" capture-pane -p -J -t "$SESSION":0.0 -S -200

启动会话后,始终打印监控命令:

To monitor:
  tmux -S "$SOCKET" attach -t "$SESSION"
  tmux -S "$SOCKET" capture-pane -p -J -t "$SESSION":0.0 -S -200

套接字约定

  • 使用 OTTO_TMUX_SOCKET_DIR
  • 默认套接字路径:"$OTTO_TMUX_SOCKET_DIR/otto.sock"

目标窗格和命名

  • 目标格式:session:window.pane(默认为 :0.0)。
  • 保持名称简短;避免空格。
  • 检查:tmux -S "$SOCKET" list-sessions, tmux -S "$SOCKET" list-panes -a

查找会话

  • 在您的套接字上列出会话:{baseDir}/scripts/find-sessions.sh -S "$SOCKET"
  • 扫描所有套接字:{baseDir}/scripts/find-sessions.sh --all(使用 OTTO_TMUX_SOCKET_DIR)。

安全发送输入

  • 优先使用文字发送:tmux -S "$SOCKET" send-keys -t target -l -- "$cmd"
  • 控制键:tmux -S "$SOCKET" send-keys -t target C-c
  • 对于交互式 TUI 应用程序如 Claude Code/Codex,本指南涵盖 如何发送命令。 请 不要 在同一个 send-keys 中附加 Enter。这些应用程序可能会将快速文本+Enter 序列视为粘贴/多行输入而不提交;这取决于时机。将文本和 Enter 作为单独的命令发送,并添加小延迟(根据环境调整;如果需要,增加延迟,如果不支持亚秒级睡眠,则使用 sleep 1):
tmux -S "$SOCKET" send-keys -t target -l -- "$cmd" && sleep 0.1 && tmux -S "$SOCKET" send-keys -t target Enter

监视输出

  • 捕获最近历史:tmux -S "$SOCKET" capture-pane -p -J -t target -S -200
  • 等待提示:{baseDir}/scripts/wait-for-text.sh -t session:0.0 -p 'pattern'
  • 附加是可以的;使用 Ctrl+b d 分离。

生成进程

  • 对于 python REPLs,设置 PYTHON_BASIC_REPL=1(非基本 REPL 会中断 send-keys 流)。

Windows / WSL

  • tmux 在 macOS/Linux 上受支持。在 Windows 上,使用 WSL 并在 WSL 内安装 tmux。
  • 此技能仅限于 darwin/linux,并需要 tmux 在 PATH 上。

编排编码代理(Codex, Claude Code)

tmux 擅长并行运行多个编码代理:

SOCKET="${TMPDIR:-/tmp}/codex-army.sock"

# 创建多个会话
for i in 1 2 3 4 5; do
  tmux -S "$SOCKET" new-session -d -s "agent-$i"
done

# 在不同工作目录中启动代理
tmux -S "$SOCKET" send-keys -t agent-1 "cd /tmp/project1 && codex --yolo 'Fix bug X'" Enter
tmux -S "$SOCKET" send-keys -t agent-2 "cd /tmp/project2 && codex --yolo 'Fix bug Y'" Enter

# 当向 Claude Code/Codex TUI 发送提示时,将文本和 Enter 分开,并添加延迟
tmux -S "$SOCKET" send-keys -t agent-1 -l -- "Please make a small edit to README.md." && sleep 0.1 && tmux -S "$SOCKET" send-keys -t agent-1 Enter

# 轮询完成情况(检查提示是否返回)
for sess in agent-1 agent-2; do
  if tmux -S "$SOCKET" capture-pane -p -t "$sess" -S -3 | grep -q "❯"; then
    echo "$sess: DONE"
  else
    echo "$sess: Running..."
  fi
done

# 从完成的会话获取完整输出
tmux -S "$SOCKET" capture-pane -p -t agent-1 -S -500

提示:

  • 为并行修复使用单独的 git 工作树(无分支冲突)
  • 在新鲜克隆中运行 codex 之前先 pnpm install
  • 检查 shell 提示($)以检测完成情况
  • Codex 需要 --yolo--full-auto 以进行非交互式修复

清理

  • 杀死会话:tmux -S "$SOCKET" kill-session -t "$SESSION"
  • 杀死套接字上的所有会话:tmux -S "$SOCKET" list-sessions -F '#{session_name}' | xargs -r -n1 tmux -S "$SOCKET" kill-session -t
  • 移除私有套接字上的所有内容:tmux -S "$SOCKET" kill-server

助手:wait-for-text.sh

{baseDir}/scripts/wait-for-text.sh 轮询窗格以匹配正则表达式(或固定字符串),具有超时。

{baseDir}/scripts/wait-for-text.sh -t session:0.0 -p 'pattern' [-F] [-T 20] [-i 0.5] [-l 2000]
  • -t/--target 窗格目标(必需)
  • -p/--pattern 要匹配的正则表达式(必需);添加 -F 以使用固定字符串
  • -T 超时秒数(整数,默认 15)
  • -i 轮询间隔秒数(默认 0.5)
  • -l 要搜索的历史行数(整数,默认 1000)