在 nanobot 中用 tmux Skill 远程操控交互式终端:会话管理、安全输入与多 Agent 并行编排实战

发布时间:2026/11/6 2:40:53

在 nanobot 中用 tmux Skill 远程操控交互式终端:会话管理、安全输入与多 Agent 并行编排实战 在 nanobot 中用 tmux Skill 远程操控交互式终端会话管理、安全输入与多 Agent 并行编排实战【免费下载链接】nanobotUltra-lightweight, open-source, self-hosted personal AI agent framework in Python with WebUI, tools, memory, MCP, multi-agent workflows, automation, and chat apps项目地址: https://gitcode.com/gh_mirrors/nanob/nanobot导读本篇文章基于 nanobot 内置的 tmux Skill 展开介绍如何让 AI Agent 通过 tmux 远程操控交互式 CLI创建隔离的 tmux 会话、向指定 pane 发送按键、抓取 pane 输出并轮询等待特定文本以及利用多会话并行编排 Codex、Claude Code 等编码 Agent。读完本文你将掌握一套可复制的 交互式 TTY 远程控制 操作范式并理解其背后的技能加载机制与配套 Bash 脚本的实现细节。tmux Skill 是什么tmux 是运行在 macOS / Linux 上的终端复用器。nanobot 将其封装为一个内置技能skill使 Agent 能在自己的执行环境中通过tmux -S socket命令族对后台运行的交互式程序如 Python REPL、交互式 CLI、编码 Agent进行远程控制。技能元数据位于 SKILL.md 的 YAML frontmatter 中--- name: tmux description: Remote-control tmux sessions for interactive CLIs by sending keystrokes and scraping pane output. metadata: {nanobot:{emoji:,os:[darwin,linux],requires:{bins:[tmux]}}} ---其中requires.bins: [tmux]声明了该技能的前置条件。从 skills.py 的实现看技能加载器会用shutil.which(tmux)检查 PATH 中是否存在该二进制若缺失则在技能摘要中标记为unavailable。同时os: [darwin, linux]说明它只在 macOS / Linux 上生效Windows 上需要借助 WSL。技能的使用边界在文档开头就明确给出只有需要交互式 TTY 时才使用 tmux对于长时间运行、无需交互的后台任务应优先使用 exec 后台模式而不是占用一个 tmux 会话。Quickstart用隔离 socket 快速起一个 REPL 会话核心思路是使用独立的 socket 文件隔离 Agent 的 tmux 实例避免与用户桌面上其他 tmux 会话冲突。完整启动流程如下SOCKET_DIR${NANOBOT_TMUX_SOCKET_DIR:-${TMPDIR:-/tmp}/nanobot-tmux-sockets} mkdir -p $SOCKET_DIR SOCKET$SOCKET_DIR/nanobot.sock SESSIONnanobot-python tmux -S $SOCKET new -d -s $SESSION -n shell tmux -S $SOCKET send-keys -t $SESSION:0.0 -- PYTHON_BASIC_REPL1 python3 -q Enter tmux -S $SOCKET capture-pane -p -J -t $SESSION:0.0 -S -200new -d以 detached分离模式创建会话Agent 无需真的附加到终端send-keys ... Enter向 pane 发送命令并按下回车capture-pane -p -J -t ... -S -200抓取最近 200 行 pane 输出-J合并被折行的行-S表示从倒数第 N 行开始。启动后Skill 要求 Agent 总是打印一段 monitor commands 备忘方便后续人工或 Agent 自己监控To monitor: tmux -S $SOCKET attach -t $SESSION tmux -S $SOCKET capture-pane -p -J -t $SESSION:0.0 -S -200Socket 约定一律使用环境变量NANOBOT_TMUX_SOCKET_DIR指定 socket 目录默认 socket 路径为$NANOBOT_TMUX_SOCKET_DIR/nanobot.sock未设置该环境变量时回退到${TMPDIR:-/tmp}/nanobot-tmux-sockets该回退逻辑同样体现在 find-sessions.sh 中。这种 每实例一个私有 socket 的约定将 nanobot 的 tmux 会话与其他 tmux 用户完全隔离开是安全性的第一层保障。定位与命名target 格式与查询命令tmux 的 target 格式为session:window.pane未指定时默认为:0.0即当前会话的第一个窗口的第一个 pane。技能建议会话、窗口名称保持简短避免空格方便作为 target 直接引用用tmux -S $SOCKET list-sessions列出会话用tmux -S $SOCKET list-panes -a列出所有 pane。用 find-sessions.sh 查找会话当会话散落在多个 socket 上时直接使用仓库自带的辅助脚本# 列出当前 socket 上的会话 {baseDir}/scripts/find-sessions.sh -S $SOCKET # 扫描 NANOBOT_TMUX_SOCKET_DIR 下所有 socket {baseDir}/scripts/find-sessions.sh --all脚本路径在仓库中为 nanobot/skills/tmux/scripts/find-sessions.shSKILL.md 中的{baseDir}即技能目录。从源码看它支持三类参数参数含义-L, --sockettmux socket 名称透传tmux -L-S, --socket-pathtmux socket 路径透传tmux -S-A, --all扫描NANOBOT_TMUX_SOCKET_DIR下所有 socket与-L/-S互斥-q, --query大小写不敏感的子串过滤会话名脚本内部用list-sessions -F #{session_name}\t#{session_attached}\t#{session_created_string}格式化输出会话名、附加状态与创建时间并标注attached/detached见 find-sessions.sh。--all模式只会处理目录下类型为 socket-S判断的条目避免误伤普通文件。安全输入优先字面量发送向 pane 发送按键是远程操控的核心动作技能给出两条铁律优先字面量发送tmux -S $SOCKET send-keys -t target -l -- $cmd-lliteral会按字面解释按键而不是把内容当作按键名称解析可避免命令内容被 tmux 误解释控制键单独发送tmux -S $SOCKET send-keys -t target C-c发送C-c、C-d、Enter这类控制键时不要使用-l直接以按键名发送。观察输出抓取与等待capture-pane 抓取历史tmux -S $SOCKET capture-pane -p -J -t target -S -200-S -200表示抓取倒数 200 行以内的历史输出是 Agent 读取运行结果的标准姿势。-J合并折行保证长行内容完整。wait-for-text.sh 轮询等待多数场景下 Agent 需要 等到某个输出出现后再继续仓库为此提供了轮询脚本 wait-for-text.sh{baseDir}/scripts/wait-for-text.sh -t session:0.0 -p pattern [-F] [-T 20] [-i 0.5] [-l 2000]参数说明与脚本 help 一致参数含义默认值-t, --targetpane target必填—-p, --pattern要匹配的正则必填—-F, --fixed将 pattern 视为固定字符串对应grep -F关闭默认grep -E-T, --timeout超时秒数整数15-i, --interval轮询间隔秒数0.5-l, --lines参与匹配的历史行数整数1000从 wait-for-text.sh 的实现看脚本循环执行tmux capture-pane -p -J -t $target -S -${lines}将抓取结果交给grep匹配命中即exit 0超时则把最后lines行输出打印到 stderr 并exit 1。它还会校验timeout、lines必须为整数并检查tmux是否在 PATH 中——这保证了脚本在 Agent 环境中的确定性。人工附加技能明确表示 attach 是被允许的但要求用Ctrlb d分离避免长时间占用。派生进程的注意事项当目标程序是 Python REPL 时务必设置PYTHON_BASIC_REPL1PYTHON_BASIC_REPL1 python3 -q技能文档指出非 basic 的 REPL 会破坏 send-keys 流程。因为带语法高亮、行编辑等增强特性的 REPL 会向 TTY 发送 ANSI 转义序列并采用非标准的输入解析字面量 send-keys 的结果会与预期不符-q则关闭启动 banner减少抓屏噪声。Windows / WSL 支持tmux 只支持 macOS / LinuxWindows 上请使用 WSL并在 WSL 内部安装 tmux技能在元数据层被限定为darwin/linux并要求tmux在 PATH 中不满足条件的平台不会加载该技能。实战并行编排多个编码 AgentCodex、Claude Codetmux 的最大价值场景是并行运行多个编码 Agent每个 Agent 独占一个会话互不干扰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 # 在不同的工作目录启动 Agent 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 # 轮询完成状态检查 shell 提示符是否已返回 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实战要点来自 SKILL.md 的 Tips并行修复不同问题时使用独立的 git worktree避免分支冲突对全新 clone 的仓库先执行pnpm install再运行 codex避免依赖安装期间 Agent 空转以 shell 提示符❯或$是否出现来判断 Agent 是否完成Codex 需要--yolo或--full-auto才能进行非交互式修复。这套模式的核心是 创建会话 → 注入命令 → 抓屏轮询 → 读取结果与 wait-for-text.sh 结合后还可以把grep -q ❯的轮询升级为等待具体输出模式。清理回收会话与 socket会话用完后必须清理避免资源泄漏# 杀掉单个会话 tmux -S $SOCKET kill-session -t $SESSION # 杀掉该 socket 上的所有会话 tmux -S $SOCKET list-sessions -F #{session_name} | xargs -r -n1 tmux -S $SOCKET kill-session -t # 彻底移除私有 socket连 server 一起结束 tmux -S $SOCKET kill-serverkill-server会终止该 socket 对应的整个 tmux server是清理私有 socket 的最彻底方式对于共享 socket 则建议按会话逐个 kill。技能如何被 nanobot 加载tmux Skill 位于仓库 nanobot/skills/tmux/ 目录是 nanobot 的内置技能之一完整列表见 skills/README.md。加载机制集中在 nanobot/agent/skills.pyBUILTIN_SKILLS_DIR指向nanobot/skills见 skills.pySkillsLoader._skill_entries_from_dir遍历每个子目录寻找SKILL.md见 skills.pyfrontmatter 的name/description是技能触发与身份识别字段metadata中可携带requires.bins、requires.env、always、os等扩展信息_check_requirements用shutil.which校验bins、用os.environ校验env不满足则技能标记为 unavailable见 skills.pyAgent 会话构建上下文时会通过build_skills_summary以渐进式加载的方式把技能名、描述与可用性注入上下文Agent 按需用 read_file 读取完整 SKILL.md见 skills.py。此外用户可以在配置中通过agents.defaults.disabledSkills屏蔽不需要的内置技能见 docs/configuration.md 中关于 disabledSkills 的说明。该技能目录的 layoutSKILL.mdscripts/也完全符合 skill-creator 技能所描述的 SKILL.md 保持精简、确定性逻辑下沉到 scripts 的渐进式披露原则。小结tmux Skill 为 nanobot 的 Agent 提供了一套低成本、确定性的 交互式 TTY 远程控制 能力私有 socket 隔离环境、字面量发送保证输入可靠、capture-pane wait-for-text.sh 实现输出观察与同步等待多会话并行则让编码 Agent 编排成为可能。配合 find-sessions.sh 与 wait-for-text.sh 两个经过参数校验的脚本整套流程既适合 Agent 自主执行也方便人工介入排障。需要特别牢记的是tmux 只用于真正需要交互式 TTY 的场景非交互的长时间任务应交给 exec 后台模式这也是技能文档开篇反复强调的边界。【免费下载链接】nanobotUltra-lightweight, open-source, self-hosted personal AI agent framework in Python with WebUI, tools, memory, MCP, multi-agent workflows, automation, and chat apps项目地址: https://gitcode.com/gh_mirrors/nanob/nanobot创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/6 2:40:52

Arduino玩转MPU6050六轴传感器:从接线到姿态解算与排坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:28:40

多传感器融合SLAM实战:视觉+激光雷达如何提升建图精度

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/6 2:39:01

原生应用选型、架构与性能优化实战指南

原生应用这四个字,放在五年前是个默认选项,放在今天反而成了一个需要反复论证的选择。我最近刚把一个团队从跨平台方案迁回原生,整个过程踩的坑比预想的多得多,也让我重新梳理了一遍:什么样的项目真的该做原生&#xf…

2026/11/6 2:39:01

JS 鼠标悬停提示框(tooltip)完整实现与选型

1. 先把需求拆开看:提示框要解决什么问题“js实现鼠标放上按钮出现提示”这句话本身信息很少,但它背后要处理的事情比想象中多。一个按钮上放一段说明文字,鼠标移上去显示、移开消失——听起来十几行 JS 就能收工,可真放到项目里&…

2026/11/6 2:39:01

PropertyTree:用属性树统一分层配置与类型校验

简介:PropertyTree 是一份面向 C#/WinForms 桌面开发者的开源控件资料,主要解决树形导航与分组设置界面之间的联动问题:把多组控件与 TreeView 节点建立关联,选择不同节点时显示对应的控件组,适合属性面板、参数配置和…

2026/11/6 2:39:01

网络端口详解:从基础概念到安全运维实践

1. 网络端口基础概念解析端口在网络通信中扮演着至关重要的角色,它们就像是服务器上的"门牌号",帮助数据包准确找到对应的服务。每个端口都有一个16位的数字标识(0-65535),由IANA(互联网数字分配…

2026/11/6 2:39:01

室内可见光通信系统建模与性能优化实践

1. 室内可见光通信系统概述可见光通信(VLC)技术利用LED照明光源作为信号发射器,通过快速调制光强来传输数据。相比传统射频通信,VLC具有无电磁干扰、频谱资源丰富、与照明系统天然融合等独特优势。在室内应用场景中,典…

2026/11/6 2:34:00

OpenClaw跨云平台AI模型部署实战指南

1. 项目背景与核心价值OpenClaw作为新一代开源机器学习框架,其云端部署能力直接决定了实际业务场景中的可用性。最近在技术社区看到不少同行在讨论如何实现OpenClaw的跨环境部署,特别是对国内外不同模型支持方案的兼容性问题。这个问题我在去年做金融风控…

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/6 1:03:39

MCU晶振电路设计全解析:从负载电容计算到PCB布局调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 15:39:06

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑