惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

N
News and Events Feed by Topic
Malwarebytes
Malwarebytes
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
Cybersecurity and Infrastructure Security Agency CISA
F
Future of Privacy Forum
C
Cisco Blogs
T
The Exploit Database - CXSecurity.com
A
Arctic Wolf
S
Securelist
K
Kaspersky official blog
S
Schneier on Security
T
ThreatConnect
T
Tenable Blog
Spread Privacy
Spread Privacy
T
True Tiger Recordings
AWS News Blog
AWS News Blog
F
Fox-IT International blog
量子位
T
Threatpost
V
Vulnerabilities – Threatpost
C
CERT Recently Published Vulnerability Notes
Cisco Talos Blog
Cisco Talos Blog
GbyAI
GbyAI
宝玉的分享
宝玉的分享
腾讯CDC
G
Google Developers Blog
aimingoo的专栏
aimingoo的专栏
Cyberwarzone
Cyberwarzone
有赞技术团队
有赞技术团队
S
SegmentFault 最新的问题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
U
Unit 42
雷峰网
雷峰网
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
O
OpenAI News
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The GitHub Blog
The GitHub Blog
The Register - Security
The Register - Security
MyScale Blog
MyScale Blog
小众软件
小众软件
A
About on SuperTechFans
Last Week in AI
Last Week in AI
Y
Y Combinator Blog
博客园 - 三生石上(FineUI控件)
美团技术团队
Google Online Security Blog
Google Online Security Blog
P
Proofpoint News Feed
MongoDB | Blog
MongoDB | Blog

博客园_首页

软考 - 架构设计师 知识点总结 给 FastApiAdmin 加个“会议纪要”模块,我把后端二次开发的坑踩了个遍 聊一聊 MES系统如何实现多种标签打印并支持不同打印机 2026第四届LitCTF网络安全挑战赛Pwn的wp 断尺问题:戴德金分割现实悖论 给句子做个“语义审计”:从词向量到句子向量的方法论 当AI“卡壳”在生产环境:MCP Server 如何帮我们破局 ofdkit-harmony 0.2.0 发布:鸿蒙原生 OFD 阅读库,已上架 ohpm 有了AI测试工具,还需要掌握Playwright、Pytest、Selenium这些框架吗? 组织转型实录——我把传统研发团队改成AI驱动,踩了无数坑 为什么 AI Coding 难进生产环境?深入了解 Everything-Claude-Code ! 到底 TMD 用哪个: npm, pnpm, Yarn, Bun, Deno? 傻瓜, 当然用 npm 啦 上周热点回顾(5.18-5.24) [对比学习LangChain和MAF-04]针对消息的设计 TrueAsync Server 为 PHP 带来了原生的高性能 HTTP 服务器 规则漂移 帆软市场部为什么能成为高人效增长系统? 22. LangChain LCEL,用 | 串联AI的魔法语言 - 老陈说编程 完整学习LLM(二):大模型到底是什么 洛谷-P11942 [KTSC 2025] 重塑矩阵 题解 哈哈哈哈哈打不过我吧,没有办法我(vllm)就是这么强大! Hermes Edu Skills 从 170 到 188:一次中文教育 Agent Skill Pack 的工程化升级 一个外行,半年搞定机械臂:我的从0到1踩坑实录 新写了个直播录制工具,可录制抖音快手斗鱼直播 15天学会AI应用开发(一)搭建AI大模型应用开发环境 Childhood,23款童年卡牌游戏复刻 Github Copilot配置GPT5.5报错:'temperature' does not support 0.1 with this model. Only the default (1) value is supported. - Eric zhou 单曲循环 ClassIn 在 Linux 下无法播放音频 把 TeXstudio / LaTeX 工程交给 AI:texstudio-mcp 功能详解 .NET 8 Web开发入门(六):Blazor 全栈开发——告别 JavaScript 焦虑 别让 LLM 写文件:一套 Agent 进度跟踪的工程化范式 - BurningFish Qt Bridges for C# 深度技术解析 Multus 多网卡方案:IPVLAN 模式 被流量逼出来的架构:从一台服务器到云原生的 17 次蜕变 —— 集群、缓存、MQ、微服务、Docker、K8S 的前世今生 Claude Code安装全流程 Windows保姆级教程 awk 命令练习(从入门到进阶) Java + Spring实现Hermes Agent之龙虾、Skills、Mcp和沙箱代码执行环境思路 轨迹的蓝图:方程求解与交点计算 Agent新技术分享-Forge论文已被ACM接受 PowerMem 记忆系统的遗忘设计,从神经元到代码工程 我用了FastApiAdmin后,连夜把踩过的坑都整理出来了 一个程序员眼中的 AI 核心概念,讲透 LLM 、Agent 、MCP 、Skill 、RAG... 网络安全在线就能打的内网靶场推荐 & Dawn Breaker 单域靶场 WP CTF 中如何用提示词发挥大模型的最大实力:从聊天助手到大手子 PyTorch KernelAgent 源码解读 ---(6)--- Composer 高光谱拼接算法(一)扫推式成像和航带拼接算法 一文看懂fofa常用语法,告别混淆,精准打击! 从零搭建量化投资系统:用 Qlib 一行代码搞定均线分析 企业 AI 落地,第一件事不是买模型,而是建好企业知识库 如何在Oracle Agent Factory中配置国内厂商的LLM? Codex 换模型太麻烦?这个开源桌面工具帮你一键切换 Avalonia中的动画 2026软考|十大管理超全通俗笔记,备考闭眼记! rv1126b内置phy接hub交换机芯片 React 可拖拽列宽 + 点击行选中 ProTable 封装笔记 五大实锤证据:AI不会终结低代码,只会倒逼技术进化 【硬核脑洞】16位实模式最后的疯狂:我们能否在 640KB 常规内存里手搓一个 MD 模拟器? 基于.Net的NetCoreKevin框架中AgentFramework实现AI智能体Skill和工具动态管理和加载 PostgreSQL 高可用集群 patroni 自动故障转移测试 自己使用C++开发的仿OpenClaw、Hermes智能体工具 记一次 .NET 某集群管理软件 内存暴涨分析 StarBlog番外(5) 从1.6到1.10,基于Avalonia AOT 开发的 Publisher 半年进化之路 Anthropic 把 SOC 误报率从 33% 砍到 7%,真正在干活的不是 Claude SM2演示所有 PEM 功能(生成、加解密、签名/验签) 用 Solon AI 从零构建 MCP 工具服务:让 AI Agent 拥有真实世界的能力 完整学习LLM(一):为什么我要系统学习大模型 Agent Harness Runtime 架构深度解析:工具循环、状态外置与长程任务调度 [对比学习LangChain和MAF-03]完全不同的Agent设计哲学 毫不夸张地说,这将是目前最全的AI测试教程!测试必看! AI Coding 为什么选择 TUI ,前端的新机会在哪里? 无需安装cc switch,10行命令帮你配置Claude Code+deepseek Context Engineering 到 Harness Engineering —— 大模型时代软件工程的新范式 OpenClaw.NET 兼容性目录指南(Compatibility Catalog) Nginx 上游健康检查插件 nginx-healthcheck-module 三角形数 AScript异步执行与await关键字 - rockey627 Vector Quantization for Recommendation 笔记 21. “|”不只是按位或,90%的人不知道 这 3 年做教育相关项目,我把一些经验整理成了一个开源 Agent Skills 项目 2026 西安本土 GEO 测评:灵怡云凭差异化站稳第一梯队 PortSwigger SQL注入LAB7 & LAB8 & LAB9 Splay 学习笔记 这款爆款激光粒度仪凭何全球狂销5000台?揭秘百特Bettersize2600“常青树”背后的硬核实力 十分钟学习 TypeScript 【学习笔记】《Python编程 从入门到实践》第1章学习笔记:Python环境搭建与Hello World(完整版) 初试 vibe coding:Tauri + React + Rust 构建的 windows 本地番茄钟 从 Vibecoding 入门,到 Agent 差点入土 IDEA Maven 手动替换第三方Jar包完整教程 填充与积累:积分与面积的可视化 告别 Django Admin!这个 NodeJS 全栈框架让你在 DTO 中直接配置 Table/Form 渲染 重建 AI 认知第 1 篇:基础认知——一张地图看懂 AI Landscape VAPD AgentKit:可组合 Agent 前端通用库实践 SolonCode v2026.5.21 发布,Web 能看项目,IM 能找队友 从 LangGraph 回到 Model-Tool Loop:更聪明的模型,正在让 Agent 架构重新变简单 从人工同步到自动闭环:跨 Java/.NET 代码转换工具的工程化实践 你的显卡能跑多少算子?用 55 个检查项,给 PyTorch GPU 环境做一次冒烟测试 Claude Code 快速开始 2分钟搞定全网巡检:一个脚本+五大必备 Python 库,让你一天干别人一周的活 最近面完 30 个想转 AI 测试的人,我麻了:80% 都踩了这 4 个坑!
用 FRP 打通云服务器与本地 Ubuntu,让 Codex 远程调试本地硬件
icuic · 2026-05-25 · via 博客园_首页

最近在做一个结合强化学习、嵌入式部署和机器人控制的项目,目标是把训练得到的控制策略部署到 STM32H747I-DISCO,并进一步控制 Petoi 机器狗。

项目开发过程中,我遇到一个很现实的问题:我的 Codex 工作环境主要运行在云服务器上,但硬件设备却连接在我本地的一台 Ubuntu 服务器上。

也就是说:

  • Codex 可以方便地访问云服务器上的项目代码;
  • Petoi 机器狗和 STM32H747I-DISCO 却通过 USB 连接在本地 Ubuntu 上;
  • 本地 Ubuntu 没有公网 IP,云服务器无法直接 SSH 到它。

如果不解决这个问题,调试流程就会变成下面这样:

flowchart LR A["Codex 给出命令"] --> B["我复制命令"] B --> C["粘贴到本地 Ubuntu 执行"] C --> D["复制命令输出"] D --> E["粘贴回 Codex 分析"] E --> F["Codex 给出下一步"] F --> B

这个流程非常痛苦。

对于普通软件项目,这样手动来回复制几次也许还能忍。但对于硬件调试来说,情况完全不同。硬件调试往往需要频繁执行命令、观察输出、调整脚本、重新烧录、读取串口或 OpenOCD 状态。如果每一步都要手动复制粘贴,效率会非常低,也很容易出错。

后来我通过 FRP 打通了云服务器与本地 Ubuntu 之间的反向 SSH 通道,使 Codex 可以通过云服务器直接登录到本地 Ubuntu,从而直接调试连接在本地 Ubuntu 上的硬件设备。

这篇文章记录一下这个过程。

问题背景

我的实际开发环境大致如下:

  • Windows PC 可以通过 Codex / SSH 访问云服务器;
  • 云服务器有公网 IP;
  • 本地 Ubuntu 在局域网内,没有公网 IP;
  • Petoi 机器狗和 STM32H747I-DISCO 通过 USB 连接在本地 Ubuntu 上。

其中,Windows PC 可以访问云服务器,云服务器也有公网 IP。

但是本地 Ubuntu 位于局域网中,没有公网 IP。云服务器不能直接 SSH 到本地 Ubuntu。

这就导致 Codex 虽然可以在云服务器上帮我分析代码、构建固件、生成命令,但无法直接操作连接在本地 Ubuntu 上的硬件。

而硬件调试又恰恰需要直接访问本地 Ubuntu,例如:

lsusb
ls /dev/ttyACM*
openocd ...
arduino-cli ...
python scripts/xxx.py

如果 Codex 无法直接执行这些命令,整个调试体验就会退化成“人工搬运命令和输出”。

为什么选择 FRP

为了解决这个问题,我需要一种方式,让云服务器能够访问本地 Ubuntu。

常见方案有几种:

  • 给本地 Ubuntu 配置公网 IP;
  • 在路由器上做端口映射;
  • 使用 Tailscale / ZeroTier 这类组网工具;
  • 使用 FRP 做反向隧道。

我的场景下,FRP 是一个很合适的选择。

原因是:

  • 云服务器有公网 IP,可以作为 FRP server;
  • 本地 Ubuntu 虽然没有公网 IP,但可以主动连接云服务器;
  • 一旦本地 Ubuntu 主动连上云服务器,就可以把本地 SSH 端口反向暴露到云服务器;
  • Codex 已经可以访问云服务器,因此也就间接获得了访问本地 Ubuntu 的能力。

最终效果是:Codex 仍然只操作云服务器,但云服务器上的 127.0.0.1:REMOTE_SSH_PORT 会通过 FRP 转发到本地 Ubuntu 的 SSH 服务。

从 Codex 的角度看,它只需要在云服务器上执行:

ssh -p REMOTE_SSH_PORT ubuntu@127.0.0.1

就能登录到本地 Ubuntu。

整体架构

整个链路可以画成这样:

flowchart TD A["Windows / Codex"] -->|"SSH"| B["云服务器"] B -->|"访问 127.0.0.1:REMOTE_SSH_PORT"| C["frps"] D["frpc"] -->|"主动连接云服务器"| C D -->|"转发到 127.0.0.1:LOCAL_SSH_PORT"| E["本地 Ubuntu SSH"] E -->|"USB / 串口 / OpenOCD"| F["Petoi 机器狗 / STM32H747I-DISCO"]

其中:

  • frps 运行在云服务器;
  • frpc 运行在本地 Ubuntu;
  • 本地 Ubuntu 主动连接云服务器;
  • 云服务器监听一个本地端口,例如 REMOTE_SSH_PORT
  • 访问云服务器的 127.0.0.1:REMOTE_SSH_PORT,实际会被转发到本地 Ubuntu 的 SSH 服务。

这里有一点很重要:云服务器上的反向 SSH 入口只绑定到 127.0.0.1,而不是 0.0.0.0

这样外部网络无法直接访问这个 SSH 隧道,只有云服务器本机上的进程可以访问它,安全性更好。

云服务器上的 frps 配置

云服务器上运行 frps,配置大致如下:

bindAddr = "0.0.0.0"
bindPort = FRP_SERVER_PORT
proxyBindAddr = "127.0.0.1"

auth.method = "token"
auth.token = "REPLACE_WITH_YOUR_TOKEN"

说明:

  • bindPort = FRP_SERVER_PORT:本地 Ubuntu 的 frpc 会连接云服务器的这个端口;
  • proxyBindAddr = "127.0.0.1":反向暴露出来的 SSH 端口只监听云服务器本机;
  • auth.token:认证 token,不能提交到 Git,也不要写进公开博客。

启动 frps

./frps -c frps.toml

启动成功后,云服务器会等待本地 Ubuntu 上的 frpc 连接。

本地 Ubuntu 上的 frpc 配置

本地 Ubuntu 上运行 frpc,配置大致如下:

serverAddr = "YOUR_CLOUD_PUBLIC_IP"
serverPort = FRP_SERVER_PORT

auth.method = "token"
auth.token = "REPLACE_WITH_YOUR_TOKEN"

[[proxies]]
name = "local-ubuntu-ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = LOCAL_SSH_PORT
remotePort = REMOTE_SSH_PORT

说明:

  • serverAddr 是云服务器公网 IP;
  • serverPort 对应云服务器上的 frps 监听端口;
  • localPort = LOCAL_SSH_PORT 是本地 Ubuntu 的 SSH 端口;
  • remotePort = REMOTE_SSH_PORT 是云服务器上暴露出来的反向 SSH 端口;
  • 由于云服务器上配置了 proxyBindAddr = "127.0.0.1",所以 REMOTE_SSH_PORT 只会绑定在云服务器本机。

启动 frpc

./frpc -c frpc.toml

连接成功后,云服务器上的 frps 日志里会出现类似信息:

client login info ...
new proxy [local-ubuntu-ssh] type [tcp] success
tcp proxy listen port [REMOTE_SSH_PORT]

验证 SSH 隧道

在云服务器上执行:

ssh -p REMOTE_SSH_PORT ubuntu@127.0.0.1

如果能登录到本地 Ubuntu,就说明链路已经打通。

也可以执行一个简单命令验证:

ssh -p REMOTE_SSH_PORT ubuntu@127.0.0.1 "hostname && whoami && pwd"

这样 Codex 就可以在云服务器上直接操作本地 Ubuntu 了。

这对 Codex 调试硬件有什么帮助

打通这条链路之后,调试体验发生了很大变化。

之前和现在的差异,可以概括成下面这张图:

flowchart TD subgraph Before["打通之前"] A1["Codex 生成命令"] --> A2["我手动复制"] A2 --> A3["本地 Ubuntu 手动执行"] A3 --> A4["我复制输出"] A4 --> A5["粘贴给 Codex 分析"] A5 --> A2 end subgraph After["打通之后"] B1["Codex"] --> B2["SSH 到本地 Ubuntu"] B2 --> B3["直接执行命令"] B3 --> B4["直接读取输出"] B4 --> B5["继续分析并执行下一步"] B5 --> B3 end

这对硬件调试尤其重要。

例如,Codex 可以直接执行:

lsusb

确认 STM32H747I-DISCO 是否被识别:

STMicroelectronics STLINK-V3

也可以直接检查串口设备:

ls -l /dev/ttyACM*

可以直接调用 OpenOCD 烧录 STM32:

openocd -f interface/stlink.cfg -f target/stm32h7x.cfg ...

这样 Codex 不再只是“给建议”,而是可以真正参与调试闭环。

一个实际例子:调试 STM32H747I-DISCO

在这个项目里,我曾经需要把一个 STM32H747I-DISCO 的 demo 烧录到板子上。

板子连接在本地 Ubuntu 上,但构建和代码分析主要在云服务器上完成。

通过 FRP 打通之后,Codex 可以直接:

  1. 在云服务器上编译固件;
  2. 把 ELF 或 BIN 传到本地 Ubuntu;
  3. 调用本地 OpenOCD;
  4. 烧录 STM32H747I-DISCO;
  5. 读取 OpenOCD 输出;
  6. 判断烧录是否成功;
  7. 如果程序没跑起来,再读取 PC、寄存器、fault 状态继续分析。

例如,烧录成功时 OpenOCD 会输出:

Programming Finished
Verified OK
Resetting Target

如果没有这条远程链路,每一次烧录和排错都需要我手动在两个环境之间来回搬运信息。

一个实际例子:调试 Petoi 机器狗

Petoi 机器狗也是类似情况。

它连接在本地 Ubuntu 上,云服务器无法直接访问串口或 USB 设备。

打通 FRP 后,Codex 可以直接在本地 Ubuntu 上检查设备、执行脚本、读取返回结果。

这让调试变成了真正的远程协作:观察设备状态、修改或执行脚本、分析输出、决定下一步动作,都可以在同一条 SSH 链路里连续完成。

对我来说,这比手动复制粘贴命令高效太多。

安全注意事项

这种方案虽然方便,但安全问题必须重视。

我采用了几个基本原则:

第一,FRP token 不提交到 Git。

auth.token = "REPLACE_WITH_YOUR_TOKEN"

真实 token 只放在本地配置文件或环境变量中。

第二,云服务器上的反向 SSH 入口只绑定到本机。

proxyBindAddr = "127.0.0.1"

这样外部机器不能直接访问云服务器的 REMOTE_SSH_PORT 端口。

第三,本地 Ubuntu 的 SSH 仍然使用密钥认证。

不要为了方便而开启弱密码登录。

这件事给我的启发

这次经历让我更深刻地意识到,AI 编程助手在硬件项目里的能力,强烈依赖于它能否进入真实调试闭环。

如果 Codex 只能“看代码”和“给命令”,那它更像一个高级问答工具。

但如果它可以:

  • 直接运行命令;
  • 直接读取设备状态;
  • 直接烧录固件;
  • 直接分析 OpenOCD 或串口输出;
  • 直接根据结果调整下一步;

那它就不再只是提供建议,而是在真正参与工程调试。

对于嵌入式和机器人项目来说,这一点非常关键。

因为这类项目的问题往往不只在代码里,还在:

  • USB 设备是否识别;
  • 串口权限是否正确;
  • 固件是否成功烧录;
  • MCU 是否 HardFault;
  • 外设初始化是否成功;
  • 机器人是否真实响应命令。

只有让 AI 进入这些真实反馈环节,它才能发挥出更大的价值。

总结

这次用 FRP 打通云服务器和本地 Ubuntu,本质上解决的是一个“远程 AI 协作调试硬件”的问题。

最终效果是:Windows 上的 Codex 操作云服务器,云服务器再通过 FRP SSH 到本地 Ubuntu,本地 Ubuntu 则直接访问 Petoi 机器狗和 STM32H747I-DISCO。

这条链路避免了大量手动复制粘贴命令和输出的低效操作,让 Codex 可以直接参与硬件调试。

对于我这个项目来说,这一步非常关键。它让云服务器上的 AI 编程助手,真正接触到了本地的机器人和开发板,也让整个强化学习、嵌入式部署、真机调试流程变得顺畅很多。

以后如果还要做类似的嵌入式 AI 项目,我会优先把这种远程调试链路搭起来。因为它看似只是一个基础设施小工具,但实际能极大提升整个项目的开发效率。