做嵌入式的小伙伴,大概都有这种经历:
想临时看一眼开发板上的终端, 要么翻出 PuTTY、Xshell, 要么找串口工具, 折腾半天,就为了看一条输出。
这里我们通过工具ttyd 来实现。
ttyd是在web端一个简单的服务器命令行工具,类似我们在云厂商上直接ssh链接我们的服务器输入指令一样。
它的口号就一句话:Share your terminal over the web。 纯 C 写的单二进制程序,静态编译后基本无依赖, 起一条命令,浏览器里就能开终端。
它是怎么做到的?
关键在于 PTY 伪终端。
bash、vim、top 这些程序,都以为自己连着一块真实的屏幕。 ttyd 创建一对伪终端: 从设备(Slave)交给命令行程序, 主设备(Master)握在自己手里。
没有 PTY 会怎样? vim 直接报错 "Not a terminal", sudo 连密码都没法输。
进程模型也很简单: 一个主守护进程管 HTTP/WebSocket, 每个浏览器连上来,就 fork 一个子进程, 子进程再 fork 一次,孙进程去 exec bash, 把 stdin/stdout/stderr 全部重定向到 PTY 从设备。
数据走 WebSocket,libwebsockets 实现, 全双工、低延迟, 传的是原始字节流,ANSI 颜色序列原样保留。
前端渲染交给 xterm.js, 在浏览器里画出一个完整的终端。

(图1:ttyd 整体架构)
拿一次按键来说,你敲一个 ls:

(图2:一次按键 ls 的旅程)
整条链路延迟很低, 用起来和本地终端差不多。
这玩意能帮上忙的场景不少:
嵌入式板子资源金贵, 跑不跑得动是大家最关心的。
先看结论:开销很小。
给你一张快速对照表:
资源紧张的话, 换轻量 shell、加 -o 限制连接、 多人看用 tmux 共享, 都能把开销压下来。
上手很快, 开发板上最省事的是直接下预编译二进制:
$ wget https://github.com/tsl0922/ttyd/releases/download/1.7.7/ttyd.armhf$ chmod +x ttyd.armhf$ sudo mv ttyd.armhf /usr/local/bin/ttydarmhf 是 32 位 ARM 的包, aarch64 板子换成 ttyd.aarch64; Debian/Ubuntu 也能直接 apt install ttyd。
起服务就一条命令:
$ ttyd -p 8080 bash浏览器打开 http://开发板IP:8080 就行。
几个常用参数:
-p 8080 | |
-c admin:123456 | |
-i 127.0.0.1 | |
-o | |
-R |
重点提醒:ttyd 默认没有认证, 而且默认监听 0.0.0.0(所有接口)。 不加保护直接暴露到公网, 等于把 shell 送给了全世界。 上公网务必加
-c, 最好再挂 Nginx 反代做 TLS 和鉴权。
多个人想看同一个终端,可以这样:
$ ttyd tmux new-session -A -s demo所有浏览器都 attach 进同一个 tmux 会话, 只有一份 shell,既同步又不费资源。

(图3:开发板部署示意)
一句话概括 ttyd:
用 PTY 给命令行一个"假终端", 用 WebSocket 在浏览器和这个假终端之间搭一座双向桥, 再用 xterm.js 在网页上把桥那头原样画出来。
它没有发明新协议, 只是把 Unix 古老的终端机制和现代 Web 通信粘在一起, 轻量、实用,开发板上也跑得动。

成都见!免费领桃花岛主 20 小时 EMC 整改与设计经典教程

长鑫LPDDR6要来了 ,研发验证进入尾声!

给小学生解释Linux内核中的常用锁!