当前位置: 首页 > 后端技术 > Python

在浏览器中运行命令行,真的是太爽了!

时间:2023-03-26 00:56:23 Python

大家好,我叫查理。之前写过一篇文章《万物皆可 API》。本项目是将一些脚本的执行结果输出到网页中。但仍有很大的改进空间。例如,如果UI可以更好看,甚至可以执行交互式命令,那就太好了。最后想了想,它的最终形态不就是一个Web版的Terminal吗?然后我就想着改造这个项目,但是转念一想,如果要改造成网页版的Terminal,就必须要有开源的实现。于是我开始寻找,终于找到了几个不错的。WebTerminalttyd:https://github.com/tsl0922/ttyd,一个可以将命令行传输到Web上执行的工具,基于C编写。gotty:https://github.com/yudai/gotty,同上ttyd,不过是用Go语言写的,不过最近一次更新是2017年的,估计年久失修了。wetty:https://github.com/butlerx/wetty,基于Node.js开发,也可以将命令行转web端执行,但需要基于SSH登录,其实是web版SSH终端。SecureShell(ChromeApp):谷歌浏览器插件,同样提供网页版的SSH终端。tmate:https://tmate.io/,由tmux修改而来,可以支持终端共享。经过一些尝试,我个人首先推荐ttyd,其他的要么基于SSH,要么不太好用,要么已经停止维护。下面介绍一下ttyd的简单用法。安装其实很简单。我用的是Mac,所以可以直接用HomeBrew安装:brewinstallttyd如果你用的是Windows或Linux,还是可以支持的。安装请参考https://github.com/tsl0922/tt...章节。使用ttyd支持不少量功能配置,完成命令如下:ttydisatoolforsharingterminaloverthewebUSAGE:ttyd[options][]VERSION:1.6.3OPTIONS:-p,--port侦听端口(默认:7681,随机端口使用“0”)-i,--interface要绑定的网络接口(例如:eth0),或UNIX域套接字路径(例如:/var/run/ttyd.sock)-c,--credential用于基本身份验证的凭据(格式:用户名:密码)-u,--uid与-g一起运行的用户id,--gid与-s一起运行的组id,--signal发送到命令的信号退出时(默认值:1,SIGHUP)-a,--url-arg允许客户端在URL中发送命令行参数(例如:http://localhost:7681?arg=foo&arg=bar)-R,--readonly不允许客户端写入TTY-t,--client-option向客户端发送选项(格式:key=value),重复添加更多选项-T,--terminal-typeTermi要报告的最终类型,默认值:xterm-256color-O,--check-origin不允许来自不同来源的websocket连接-m,--max-clients支持的最大客户端(默认值:0,无限制)-o,--once仅接受一个客户端并在断开连接时退出-B,--browser使用默认系统浏览器打开终端-I,--index自定义index.html路径-b,--base-path来自a的请求的预期基本路径反向代理(例如:/mounted/here)-P,--ping-intervalWebsocketping间隔(秒)(默认值:300)-6,--ipv6启用IPv6支持-S,--ssl启用SSL-C,--ssl-certSSL证书文件路径-K,--ssl-keySSL密钥文件路径-A,--ssl-ca用于客户端证书验证的SSLCA文件路径-d,--debug设置日志级别(默认值:7)-v,--version打印版本并退出-h,--help打印此文本并退出访问https://github.com/tsl0922/ttyd以获取更多信息并报告错误。可以看到,这里可以使用-p指定运行端口,使用-c指定登录密码等基本用法来试试看,最基本的命令如下:ttydbash这样,一个web版的bash启动,运行结果如下:这里显示是在7681上运行,那么我们打开http://localhost:7681/,直接运行命令即可:verysilky。看完后面的传输协议是WebSocket,所以稳定性还是有保障的:当然我们也可以使用自己喜欢的shell,比如zsh,不用bash。命令如下:ttydzsh在这种情况下,浏览器中的shell是zsh。:绑定端口当然我们也可以更改端口,比如8000,可以使用如下命令:ttyd-p8000zsh这样ttyd就可以在8000端口上运行http服务了,我们可以打开http://localhost:8000/向上执行命令。当然,这么直接暴露BasicAuth好像也不安全。我们可以设置BasicAuth并使用-c选项指定用户名和密码。格式为用户名:密码。比如我们指定用户名和密码都是admin,那么命令就是这样写:ttyd-p8000-cadmin:adminzsh这样打开http://localhost:8000/,需要输入登录的用户名和密码:自动打开浏览器,我们也可以使用-B命令让它自动打开浏览器:ttyd-p8000-Bzsh这样运行后,默认浏览器会自动打开http://localhost:8000/,这样我们就不用敲网址了,非常方便。因此,上述命令甚至可以做成别名,如:aliaswebcmd="ttyd-p8000-Bzsh";以便您可以通过键入webcmd轻松打开Web版本的命令行。Docker支持此外,ttyd还提供了Docker镜像。如果不想安装,可以直接启动Docker。比如你可以在7681上启动它:dockerrun-it--rm-p7681:7681tsl0922/ttyd但实际上它暴露了容器内部的命令行。如果要暴露主机的命令行,需要挂载磁盘:SSH终端ttyd也支持SSH终端。命令如下:ttydlogin此时需要打开浏览器后使用SSH登录。输入正确的SSH用户名和密码后才能使用。SSLSupport如果要配置SSL支持,即如果支持HTTPS,可以自己生成一个证书,加上相应的参数启动ttyd。参考链接为:https://github.com/tsl0922/tt...。以上几种用法基本可以满足日常需要。如果想了解更多用法,可以参考它的Wiki,链接是:https://github.com/tsl0922/tt...。公网暴露当然,如果我们想暴露公网,也可以和ngrok合作。比如ttyd运行在8000端口,我可以用ngrok暴露出来:ngrokhttp8000运行结果如下:这样我就可以指定url访问这个终端了,比如这里我可以用https://11b4-2404-f801-8050-3...访问我的终端:非常好!综上所述,以上就是ttyd的基本使用。有了它,我们可以很方便地将某台机器上的终端转移到Web上执行,非常方便实用。