OA0 = Omni AI 0
OA0 是一个探索 AI 的论坛
现在注册
已注册用户请  登录
OA0  ›  技能包  ›  tmux:远程控制 tmux 会话,通过发送按键操作交互式 CLI

tmux:远程控制 tmux 会话,通过发送按键操作交互式 CLI

 
  phishing ·  2026-02-21 02:46:05 · 3 次点击  · 0 条评论  

名称: tmux
描述: 通过发送按键和抓取窗格输出,远程控制 tmux 会话以实现交互式命令行界面。
元数据: {"clawdbot":{"emoji":"🧵","os":["darwin","linux"],"requires":{"bins":["tmux"]}}}


tmux 技能 (Clawdbot)

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

快速开始 (独立套接字,bash 工具)

SOCKET_DIR="${CLAWDBOT_TMUX_SOCKET_DIR:-${TMPDIR:-/tmp}/clawdbot-tmux-sockets}"
mkdir -p "$SOCKET_DIR"
SOCKET="$SOCKET_DIR/clawdbot.sock"
SESSION=clawdbot-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

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

监控方法:
  tmux -S "$SOCKET" attach -t "$SESSION"
  tmux -S "$SOCKET" capture-pane -p -J -t "$SESSION":0.0 -S -200

套接字约定

  • 使用 CLAWDBOT_TMUX_SOCKET_DIR 环境变量(默认值为 ${TMPDIR:-/tmp}/clawdbot-tmux-sockets)。
  • 默认套接字路径:"$CLAWDBOT_TMUX_SOCKET_DIR/clawdbot.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(使用 CLAWDBOT_TMUX_SOCKET_DIR 环境变量)。

安全发送输入

  • 优先使用字面量发送:tmux -S "$SOCKET" send-keys -t target -l -- "$cmd"
  • 控制键:tmux -S "$SOCKET" send-keys -t target C-c

监控输出

  • 捕获近期历史记录: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 REPL,设置 PYTHON_BASIC_REPL=1(非基础 REPL 会中断 send-keys 流程)。

Windows / WSL

  • tmux 支持 macOS/Linux。在 Windows 上,请使用 WSL 并在 WSL 内安装 tmux。
  • 此技能仅限于 darwin/linux 操作系统,并要求 PATH 中包含 tmux

编排代码代理 (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 '修复 bug X'" Enter
tmux -S "$SOCKET" send-keys -t agent-2 "cd /tmp/project2 && codex --yolo '修复 bug Y'" 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: 完成"
  else
    echo "$sess: 运行中..."
  fi
done

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

提示:
- 使用独立的 git worktree 进行并行修复(避免分支冲突)。
- 在新克隆的仓库中运行 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)。
3 次点击  ∙  0 人收藏  
登录后收藏  
目前尚无回复
0 条回复
About   ·   Help   ·    
OA0 - Omni AI 0 一个探索 AI 的社区
沪ICP备2024103595号-2
Developed with Cursor