ttyd 是一个 C 语言编写的命令行程序,可以把任意命令行程序分享到网页上操作,可以看做是个网页版的远程终端。
这个项目最初的灵感来源于平时操作无线路由器时想在网页上执行一些命令,但是目前的开源的路由器系统(openwrt)没有一个很好的网页终端模拟器,最多也只是支持执行一个命令然后把结果显示到网页上,完全没有交互。有些路由器还不限制 top
之类的命令执行,一执行就可能会直接卡住网页界面。
找了一下类似的程序,发现了 Wetty 和 GoTTY,但是 Wetty 需要 node 运行环境,GoTTY 编译后的二进制文件太大,多数路由器的 flash 都比较小,不适合集成到路由器固件里。
一直想自己写一个,上周末终于有时间开工,现在算是可以用了,但是目前只实现了基本的 PTY 转发和网页上的显示交互,还不够完善(在这里发文的时候已经完善了许多 )。
https://github.com/tsl0922/ttyd
mac 用户可以直接用 homebrew 安装:brew install ttyd
,linux 下目前只能手工编译安装,具体步骤请查看项目的 README。
ttyd is a tool for sharing terminal over the web
USAGE: ttyd [options] <command> [<arguments...>]
OPTIONS:
--port, -p Port to listen (default: 7681)
--interface, -i Network interface to bind
--credential, -c Credential for Basic Authentication (format: username:password)
--uid, -u User id to run with
--gid, -g Group id to run with
--signal, -s Signal to send to the command when exit it (default: SIGHUP)
--reconnect, -r Time to reconnect for the client in seconds (default: 10)
--ssl, -S Enable ssl
--ssl-cert, -C Ssl certificate file path
--ssl-key, -K Ssl key file path
--ssl-ca, -A Ssl ca file path
--debug, -d Set log level (0-9, default: 7)
--help, -h Print this text and exit
截图里执行的命令是 bash
,如果想要登陆后才能使用可以执行 login
,这样网页上就和 ssh 登陆一样了。
除了直接运行 shell 外,ttyd 还可以有很多有趣的玩法,例如:
如果你想给网页上的每个人开个 docker 容器玩,可以用下面的命令启动 ttyd,这样每次打开网页都会进入 docker 容器内的 shell:
ttyd docker run -it --rm ubuntu bash
如果你想一打开网页就能直接 ssh 到另一个机器上(省去进入 bash 再执行 ssh),可以这样启动 ttyd:
ttyd ssh [email protected]
你甚至还可以直接执行一个 vim,这样打开进入网页后就只有一个 vim 编辑器可以操作:
ttyd vim
ttyd 基本上是 GoTTY 到 C 语言的移植,所以有一些可以共用的部分是直接使用 GoTTY 里的代码的。
ttyd 的开发主要在 Mac 下进行,支持 macOS 和 Linux 系统,还提供了一个可以给 OpenWrt 编译出二进制文件的 Makefile,但是我还没空在真机上测试,有兴趣的可以自己编译出 ipk 包传到路由器运行试试。