☰
openagent 的 tmux 会话控制技能:用 send-keys 与 capture-pane 远程驾驭交互式 CLI
2026/10/12 4:43:23 网站建设 项目流程
  • 人工智能
  • 大模型
  • AI 应用
  • AI Agent
  • RAG
  • MCP Clients
  • 交互助手
  • 浏览器控制

【免费下载链接】openagent

⚡️next-generation personal AI assistant powered by LLM, RAG and agent loops, supporting computer-use, browser-use and coding agent, demo: https://demo.openagentai.org

项目地址:https://gitcode.com/gh_mirrors/ca/openagent
点击查看免费下载

本指南系统讲解 openagent 内置 tmux 技能(skills/tmux/SKILL.md)的核心用法:如何通过发送按键、抓取窗格输出来控制交互式终端程序与长驻会话。读完你将掌握会话列表、输出抓取、按键注入、窗口/窗格导航、会话生命周期管理的完整命令体系,以及"文本与回车分开发送"等安全实操技巧,可直接用于监控长任务、应答交互式 CLI 提示、编程式巡检多个 tmux 会话。

技能定位:Agent 与长驻终端的"遥控器"

tmux 是业界标准的终端复用器,其价值在于会话(session)独立于 SSH 连接存活——即使断线重连,会话内的进程依然在跑。对 openagent 这类以 LLM 为大脑的个人 AI 助手而言,它天然适合承担两类任务:

  • 监控:检查正在 tmux 会话中运行的长任务是否结束、是否报错;
  • 交互:向运行中的交互式终端程序(TUI、菜单式工具、需要二次确认的 CLI)发送按键并读取响应。

该技能自身的描述也点明了适用边界:Remote-control tmux sessions for interactive CLIs by sending keystrokes and scraping pane output(通过发送按键和抓取窗格输出来远程控制交互式 CLI 的 tmux 会话),并声明前置依赖requires: { "bins": ["tmux"] }——即运行环境必须已安装 tmux 可执行文件。

技能元数据如何被 openagent 解析

SKILL.md采用"YAML front matter + Markdown 正文"的标准格式。front matter 中的name、description、metadata字段由 skillmd/skillmd.go 中的Parse函数解析:正文部分(Content)会被注入 Agent 的系统提示词,description用于技能目录检索,而metadata块中的requires.bins则声明运行时依赖(skillmd/skillmd_test.go 的测试用例验证了 name、description、emoji、metadata 的解析行为)。技能目录通过 object/skill.go 的LoadSkill读入{dir}/SKILL.md及references/目录,再由 object/merge_agent_tools.go 将load_skill内置工具注册进该 store 的工具注册表,最终通过 tool/skill.go 的Load方法把技能全文提供给模型。

何时使用、何时禁用

✅ 应该使用

  • 监控正在 tmux 中运行的会话;
  • 向交互式终端应用发送输入;
  • 抓取 tmux 中长期运行进程的输出;
  • 以编程方式在 tmux 窗格/窗口间导航;
  • 检查既有会话中的后台工作状态。

❌ 不该使用

  • 一次性 shell 命令→ 直接执行即可;
  • 启动新的后台进程→ 使用 shell 的后台化机制(如 openagent 的 shell 工具background:true);
  • 非交互式脚本→ 直接运行;
  • 进程不在 tmux 中→ 无需绕道 tmux;
  • 需要新建 tmux 会话→ 直接使用tmux new-session。

一句话判断原则:tmux 技能只负责"接管"已经存在的会话,不负责"创建"会话。新建会话属于tmux new-session的职责范围。

常用命令体系

列出会话

tmux list-sessions tmux ls

两者等价,输出当前所有会话名。Agent 在接管任何会话前,都应先列出会话以确认目标存在、避免把按键发到错误的会话上。

抓取输出(capture-pane)

# 抓取窗格最近 20 行输出(-p 打印到 stdout,供脚本/Agent 读取) tmux capture-pane -t shared -p | tail -20 # 抓取整个回滚缓冲(scrollback) tmux capture-pane -t shared -p -S - # 抓取指定窗口中的指定窗格 tmux capture-pane -t shared:0.0 -p

要点:

  • -p:将捕获内容打印到标准输出而非写入文件,这是脚本化读取的关键;
  • -S -:-S指定起始行,-表示从回滚缓冲起点开始,即抓取全部历史;
  • 目标格式为session:window.pane,例如shared:0.0表示shared会话的第 0 个窗口的第 0 个窗格。

补充:-J可保留窗格的连接线字符(joining),对读取带边框的 TUI 布局更友好,参见 skills/1password/SKILL.md 中的实际用法。

发送按键(send-keys)

# 发送文本(不按回车) tmux send-keys -t shared "hello" # 发送文本 + 回车 tmux send-keys -t shared "y" Enter # 发送特殊按键 tmux send-keys -t shared Enter tmux send-keys -t shared Escape tmux send-keys -t shared C-c # Ctrl+C(中断当前任务) tmux send-keys -t shared C-d # Ctrl+D(EOF,退出 shell) tmux send-keys -t shared C-z # Ctrl+Z(挂起进程)

send-keys的常见语义:普通字符串原样键入;Enter、Escape、C-c(Ctrl+C)、C-d(Ctrl+D)、C-z(Ctrl+Z)等是 tmux 约定的按键名。这组按键体系与 openagent 自身 shell 工具的send_keys动作高度同构——tool/shell.go 中的shellKeySequence支持enter、escape、ctrl+c、ctrl+d、ctrl+z、tab、方向键等序列映射(见 tool/shell.go)。两者的差异在于:shell 工具的 PTY 会话与命令进程生命周期绑定,而 tmux 会话可跨 SSH 连接长期存活,更适合需要"离开再回来检查"的场景。

窗口/窗格导航

# 选择窗口 tmux select-window -t shared:0 # 选择窗格 tmux select-pane -t shared:0.1 # 列出窗口 tmux list-windows -t shared

select-window与select-pane用于把"焦点"切到目标窗格,之后发送的按键才会落到该窗格;list-windows用于查看某会话下有哪些窗口及其编号,是导航前的前置侦察命令。

会话管理

# 新建分离的(detached)会话 tmux new-session -d -s newsession # 杀掉会话 tmux kill-session -t sessionname # 重命名会话 tmux rename-session -t old new

new-session -d创建后台会话并立即返回控制权,适合"先起会话、后续再注入命令"的场景;任务结束后用kill-session清理,避免遗留僵尸会话。

安全发送输入:文本与回车分开

对交互式 TUI 而言,最稳妥的发送方式是把文本与 Enter 拆成两次发送,避免粘贴或跨行输入带来的边界问题:

tmux send-keys -t shared -l -- "Please apply the patch in src/foo.ts" sleep 0.1 tmux send-keys -t shared Enter

细节说明:

  • -l(literal):以字面形式发送参数,不解析其中的按键名与转义序列,适合含特殊字符的文本;
  • --:终止选项解析,防止以-开头的文本被误认为选项;
  • sleep 0.1:在两次发送之间留出间隔,给目标程序时间处理前一条输入;
  • 先发文本、确认目标程序就绪后再发 Enter,可避免在程序尚未进入输入态时误触确认/提交。

这条建议尤其适用于确认型提示(如y/N确认、交互式编辑器保存)——先看清窗格当前状态,再决定发送什么按键。

批量巡检全部会话

当需要同时关注多个会话时,可以用一条循环遍历所有会话并抓取各自末尾输出:

for s in $(tmux list-sessions -F '#{session_name}'); do echo "=== $s ===" tmux capture-pane -t $s -p 2>/dev/null | tail -5 done

要点:

  • -F '#{session_name}':以格式化字符串输出纯会话名列表,避免解析表格文本;
  • 2>/dev/null:吞掉不存在会话时的报错,使巡检在部分会话已被清理时仍能继续;
  • tail -5:只取每个会话最近 5 行,控制单次巡检的信息量。

该模式可进一步扩展为"每个会话抓完输出后,根据关键字判断是否需要发送按键",例如对仍在等待输入的会话自动补齐确认。

真实场景:与其他技能/工具的协同

场景一:在 tmux 中运行敏感 CLI(1password 技能)

skills/1password/SKILL.md 给出了 tmux 技能的典型实战用法:op(1Password CLI)的登录态依赖单一 TTY,而 shell 工具每次命令都使用全新 TTY,会导致反复要求授权。其解决方式是创建专用 tmux 会话承载全部op命令:

SOCKET_DIR="${OPENCLAW_TMUX_SOCKET_DIR:-${TMPDIR:-/tmp}/openclaw-tmux-sockets}" mkdir -p "$SOCKET_DIR" SOCKET="$SOCKET_DIR/openclaw-op.sock" SESSION="op-auth-$(date +%Y%m%d-%H%M%S)" tmux -S "$SOCKET" new -d -s "$SESSION" -n shell tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -- "op signin --account my.1password.com" Enter tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -- "op whoami" Enter tmux -S "$SOCKET" send-keys -t "$SESSION":0.0 -- "op vault list" Enter tmux -S "$SOCKET" capture-pane -p -J -t "$SESSION":0.0 -S -200 tmux -S "$SOCKET" kill-session -t "$SESSION"

该示例完整演示了本技能的命令组合:new -d建会话 →send-keys ... Enter注入带回车的命令 →capture-pane -p -J -S -200抓取输出 →kill-session收尾。注意其中的-S "$SOCKET"指定独立 socket,避免与已有会话冲突——这是多技能共存的 socket 隔离惯例。

场景二:长时交互型编码 Agent

skills/coding-agent/SKILL.md 展示了另一条路径:对于 Codex、Pi、OpenCode 这类需要 PTY 的交互式 CLI,openagent 的 shell 工具以pty:true配合background:true启动并返回sessionId,随后用poll/write/submit/send_keys等动作持续交互(tool/shell.go 中shellExecuteBackground的 action 分派即对应实现)。tmux 技能与这套机制的定位互补:

  • 进程由 Agent 亲自拉起、生命周期可控 → 优先用 shell 工具的 background + PTY;
  • 进程在外部 tmux 中运行、需跨会话长期接管 → 使用本技能。

关键注意事项小结

  • capture-pane -p打印到 stdout,是脚本化读取的必备选项;
  • -S -可抓取整个回滚缓冲,而非仅当前屏幕;
  • 目标格式统一为session:window.pane(如shared:0.0),先list-sessions/list-windows确认再操作;
  • tmux 会话跨 SSH 断线依然存活,是"离开再回来检查"场景的首选;
  • 交互式输入遵循"先文本、后回车、中间留间隔"的安全发送模式;
  • 技能前置条件为环境中存在tmux二进制(front matter 中requires.bins),使用前可用tmux -V验证版本。

本文全部命令均可直接复制执行;如需了解技能加载机制,可继续阅读 skillmd/skillmd.go(SKILL.md 解析)、object/skill.go(技能入库与查询)、tool/skill.go(load_skill工具)以及 tool/shell.go(shell/PTY 工具实现)。

  • 人工智能
  • 大模型
  • AI 应用
  • AI Agent
  • RAG
  • MCP Clients
  • 交互助手
  • 浏览器控制

【免费下载链接】openagent

⚡️next-generation personal AI assistant powered by LLM, RAG and agent loops, supporting computer-use, browser-use and coding agent, demo: https://demo.openagentai.org

项目地址:https://gitcode.com/gh_mirrors/ca/openagent
点击查看免费下载

相关推荐

上一篇:OpenViking 测试体系完全指南:从单元测试到端到端工作流
下一篇:codeforces-go 二叉树题解:任意两节点最短移动路径「Step-By-Step Directions」的一题双解(LCA / DFS+BFS)

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询