tmux远程控制技能Skill tmux

该技能使用tmux作为可编程终端复用器,用于交互式命令行界面(CLI)工具的远程控制和自动化,如Python、gdb等。通过发送按键和捕获输出,实现高效的终端会话管理,支持Linux和macOS平台。关键词:tmux, 终端复用, 远程控制, CLI, Python, gdb, 自动化, 交互式工作。

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

name: tmux description: “通过发送按键和捕获输出,远程控制tmux会话以用于交互式CLI(如Python、gdb等)。” license: Vibecoded

tmux 技能

将tmux用作可编程终端复用器进行交互式工作。适用于Linux和macOS的标准tmux;通过使用私有套接字避免自定义配置。

快速开始(隔离套接字)

SOCKET_DIR=${TMPDIR:-/tmp}/claude-tmux-sockets  # 所有代理套接字的知名目录
mkdir -p "$SOCKET_DIR"
SOCKET="$SOCKET_DIR/claude.sock"                # 将代理会话与您的个人tmux分开
SESSION=claude-python                           # 类似缩写的名称;避免空格
tmux -S "$SOCKET" new -d -s "$SESSION" -n shell
tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -- 'python3 -q' Enter
tmux -S "$SOCKET" capture-pane -p -J -t "$SESSION":0.0 -S -200  # 监视输出
tmux -S "$SOCKET" kill-session -t "$SESSION"                   # 清理

启动会话后,务必告诉用户如何监视会话,提供一个可复制粘贴的命令:

要自己监视此会话:
  tmux -S "$SOCKET" attach -t claude-lldb

或一次性捕获输出:
  tmux -S "$SOCKET" capture-pane -p -J -t claude-lldb:0.0 -S -200

这必须在会话启动后立即打印,并在工具循环结束时再次打印。但越早发送,用户越满意。

套接字约定

  • 代理必须将tmux套接字放在CLAUDE_TMUX_SOCKET_DIR下(默认为${TMPDIR:-/tmp}/claude-tmux-sockets),并使用tmux -S "$SOCKET"以便我们可以枚举/清理它们。首先创建目录:mkdir -p "$CLAUDE_TMUX_SOCKET_DIR"
  • 除非必须进一步隔离,否则使用的默认套接字路径:SOCKET="$CLAUDE_TMUX_SOCKET_DIR/claude.sock"

目标窗格和命名

  • 目标格式:{session}:{window}.{pane},如果省略则默认为:0.0。保持名称简短(例如,claude-pyclaude-gdb)。
  • 始终使用-S "$SOCKET"以保持在私有套接字路径上。如果需要用户配置,请省略-f /dev/null;否则-f /dev/null提供干净配置。
  • 检查:tmux -S "$SOCKET" list-sessionstmux -S "$SOCKET" list-panes -a

查找会话

  • 在活动套接字上列出带有元数据的会话:./scripts/find-sessions.sh -S "$SOCKET";添加-q partial-name以过滤。
  • 扫描共享目录下的所有套接字:./scripts/find-sessions.sh --all(使用CLAUDE_TMUX_SOCKET_DIR${TMPDIR:-/tmp}/claude-tmux-sockets)。

安全发送输入

  • 优先使用字面量发送以避免shell分割:tmux -L "$SOCKET" send-keys -t target -l -- "$cmd"
  • 在组合内联命令时,使用单引号或ANSI C引用以避免扩展:tmux ... send-keys -t target -- $'python3 -m http.server 8000'
  • 发送控制键:tmux ... send-keys -t target C-cC-dC-zEscape等。

监视输出

  • 捕获最近历史(连接行以避免换行伪影):tmux -L "$SOCKET" capture-pane -p -J -t target -S -200
  • 对于连续监视,使用辅助脚本(如下)轮询,而不是tmux wait-for(它不监视窗格输出)。
  • 您也可以临时附加以观察:tmux -L "$SOCKET" attach -t "$SESSION";使用Ctrl+b d分离。
  • 当向用户提供指令时,明确打印一个可复制/粘贴的监视命令,不要假设他们记得命令。

生成进程

进程的一些特殊规则:

  • 当要求调试时,默认使用lldb
  • 启动Python交互式shell时,始终设置PYTHON_BASIC_REPL=1环境变量。这非常重要,因为非基本控制台会干扰您的send-keys。

同步/等待提示

  • 使用定时轮询以避免与交互式工具的竞争。示例:在发送代码前等待Python提示:
    ./scripts/wait-for-text.sh -t "$SESSION":0.0 -p '^>>>' -T 15 -l 4000
    
  • 对于长时间运行的命令,轮询完成文本(如"Type quit to exit""Program exited"等)后再继续。

交互式工具食谱

  • Python REPLtmux ... send-keys -- 'python3 -q' Enter;等待^>>>;使用-l发送代码;用C-c中断。始终使用PYTHON_BASIC_REPL
  • gdbtmux ... send-keys -- 'gdb --quiet ./a.out' Enter;禁用分页tmux ... send-keys -- 'set pagination off' Enter;用C-c中断;发出btinfo locals等;通过quit退出然后确认y
  • 其他TTY应用程序(ipdb,psql,mysql,node,bash):相同模式——启动程序,轮询其提示,然后发送字面文本和Enter。

清理

  • 完成后终止会话: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

./scripts/wait-for-text.sh轮询窗格以匹配正则表达式(或固定字符串),具有超时。适用于带有bash + tmux + grep的Linux/macOS。

./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)
  • 第一次匹配时退出0,超时退出1。失败时打印最后捕获的文本到stderr以帮助调试。