当前位置: 首页 > 科技观察

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

时间:2023-03-19 21:33:46 科技观察

之前看过一篇文章《万物皆可 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/ttyd#安装部分。使用ttyd支持不少量功能配置,完成命令如下:ttydisatoolforsharingterminaloverthewebUSAGE:ttyd[options][]VERSION:1.6.3OPTIONS:-p,--portPorttolisten(default:7681,use`0`forrandomport)-i,--interfaceNetworkinterfacetobind(eg:eth0),orUNIXdomainsocketpath(eg:/var/run/ttyd.sock)-c,--credentialCredentialforBasicAuthentication(format:username:password)-u,--uidUseridtorunwith-g,--gidGroupidtorunwith-s,--signalSignaltosendtothecommandwhenexitit(default:1,SIGHUP)-a,--url-argAllowclienttosendcommandlineargumentsinURL(eg:http://localhost:7681?arg=foo&arg=bar)-R,--readonlyDonotallowclientstowritetotheTTY-t,--client-optionSendoptiontoclient(format:key=value),repeattoaddmoreoptions-T,--terminal-typeTerminaltypetoreport,default:xterm-256color-O,--check-originDonotallowwebsocketconnectionfromdifferentorigin-m,--max-clientsMaximumclientstosupport(默认值:0,无限制)-o,--onceAcceptonlyoneclientandexitondisconnection-B,--browserOpenterminalwiththedefaultsystembrowser-I,--indexCustomindex.htmlpath-b,--base-pathExpectedbasepathforrequestscomingfromareverseproxy(eg:/mounted/here)-P,--ping-intervalWebsocketpinginterval(sec)(default:300)-6,--ipv6EnableIPv6support-S,--sslEnableSSL-C,--ssl-certSSLcertificatefilepath-K,--ssl-keySSLkeyfilepath-A,--ssl-caSSLCAfilepathforclientcertificateverification-d,--debugSetloglevel(default:7)-v,--versionPrinttheversionandexit-h,--helpPrintthistextandexitVisithttps://github.com/tsl0922/ttydtogetmoreinformationandreportbugs。可以看到,这里可以使用-p指定运行端口,使用-c指定登录密码等,我们来试试看。最基本的命令如下:ttydbash启动了一个网页版的bash,运行结果如下:这里显示运行在7681上,那么我们可以打开http://localhost:7681/,然后运行命令直接:非常顺利。其背后的传输协议是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/ttyd/wiki/SSL-Usage。以上几种用法基本可以满足日常需要。如果想了解更多用法,可以参考其Wiki,链接为:https://github.com/tsl0922/ttyd/wiki/Example-Usage。公网暴露当然,如果我们想暴露公网,也可以和ngrok合作。比如ttyd运行在8000端口,我可以用ngrok暴露出来:ngrokhttp8000运行结果如下:这样我就可以通过指定的url访问这个终端,比如这里我可以用https://11b4-2404-f801-8050-3-bf-00-55.ngrok.io/访问我的终端:非常好!综上所述,以上就是ttyd的基本使用。有了它,我们可以很方便地将某台机器上的终端转移到Web上执行,非常方便实用。