乐趣区

关于python:在浏览器里面运行命令行真香

大家好,我是查理。
之前写过一篇《万物皆可 API》,这个我的项目就是把一些脚本的执行后果输入到了网页外面。

然而这个还是有很多改良空间,比如说 UI 能难看些,甚至能执行交互命令该多好,最初思来想去,它的究极状态不就是一个 Web 版的 Terminal(终端)吗?

而后原本我还想着对我的项目进行革新来着,然而想想,最终如果要革新成一个 Web 版的 Terminal,这个必定曾经有开源实现了。

于是我就开始搜,最初搜到几个还不错的。

Web Terminal

  • ttyd: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 终端。
  • Secure Shell (Chrome App):Google 浏览器插件,也能够提供网页版 SSH 终端。
  • tmate:https://tmate.io/,从 tmux 批改而来,能够反对 Terminal 分享。

通过一番试用,我集体首推的还是 ttyd,其余的几个要么是基于 SSH 的,要么不怎么好用或进行保护了。

上面我就来介绍下 ttyd 的简略用法。

装置

装置其实非常简单,我用的是 Mac,所以用 HomeBrew 间接装置即可:

brew install ttyd

如果你用的是 Windows、Linux,仍然也能够反对,装置能够参考 https://github.com/tsl0922/tt… 章节。

应用

ttyd 反对不少性能配置,残缺命令如下:

ttyd is a tool for sharing terminal over the web

USAGE:
    ttyd [options] <command> [<arguments...>]

VERSION:
    1.6.3

OPTIONS:
    -p, --port              Port to listen (default: 7681, use `0` for random port)
    -i, --interface         Network interface to bind (eg: eth0), or UNIX domain socket path (eg: /var/run/ttyd.sock)
    -c, --credential        Credential for Basic Authentication (format: username:password)
    -u, --uid               User id to run with
    -g, --gid               Group id to run with
    -s, --signal            Signal to send to the command when exit it (default: 1, SIGHUP)
    -a, --url-arg           Allow client to send command line arguments in URL (eg: http://localhost:7681?arg=foo&arg=bar)
    -R, --readonly          Do not allow clients to write to the TTY
    -t, --client-option     Send option to client (format: key=value), repeat to add more options
    -T, --terminal-type     Terminal type to report, default: xterm-256color
    -O, --check-origin      Do not allow websocket connection from different origin
    -m, --max-clients       Maximum clients to support (default: 0, no limit)
    -o, --once              Accept only one client and exit on disconnection
    -B, --browser           Open terminal with the default system browser
    -I, --index             Custom index.html path
    -b, --base-path         Expected base path for requests coming from a reverse proxy (eg: /mounted/here)
    -P, --ping-interval     Websocket ping interval(sec) (default: 300)
    -6, --ipv6              Enable IPv6 support
    -S, --ssl               Enable SSL
    -C, --ssl-cert          SSL certificate file path
    -K, --ssl-key           SSL key file path
    -A, --ssl-ca            SSL CA file path for client certificate verification
    -d, --debug             Set log level (default: 7)
    -v, --version           Print the version and exit
    -h, --help              Print this text and exit

Visit https://github.com/tsl0922/ttyd to get more information and report bugs.

能够看到,这里能够应用 -p 来指定运行端口,应用 -c 指定登录明码等等。

根本应用

咱们来试下,最根本的命令如下:

ttyd bash

这样就应用启动了一个 Web 版的 bash,运行后果如下:

这里显示是在 7681 上运行的,那咱们就能够关上 http://localhost:7681/,就能够间接运行命令了:

十分丝滑。

看了下背地的传输协定是 WebSocket,所以稳定性还是有保障的:

当然,咱们也能够不必 bash,用本人喜爱的 Shell,比方 zsh,命令如下:

ttyd zsh

这样的话浏览器外面的 Shell 就是 zsh 啦:

绑定端口

当然咱们也能够更换端口,比方 8000,则能够应用如下命令:

ttyd -p 8000 zsh

这样 ttyd 就能够在 8000 端口运行 HTTP 服务,咱们关上 http://localhost:8000/ 就能够执行命令了。

Basic Auth

当然这么间接裸露进来仿佛也不太平安,咱们能够设置 Basic Auth,应用 -c 这个选项即可指定用户名明码,格局为 username:password,例如咱们指定用户名和明码都是 admin,那命令就这么写:

ttyd -p 8000 -c admin:admin zsh

这样关上 http://localhost:8000/ 之后就须要输出用户名明码才能够登录了:

主动关上浏览器

咱们还能够应用 -B 命令让它主动关上浏览器:

ttyd -p 8000 -B zsh

这样运行之后,默认的浏览器就会主动关上 http://localhost:8000/,不必咱们再去敲网址了,非常不便。

所以,下面这个命令甚至咱们还能够做成一个 alias,比方:

alias webcmd="ttyd -p 8000 -B zsh";

这样输出 webcmd 就能够轻松关上一个 Web 版命令行了。

Docker 反对

另外 ttyd 还提供了 Docker 镜像,如果你不想装置的话,能够间接启 Docker,比方这样的话就能够在 7681 上启动:

docker run -it --rm -p 7681:7681 tsl0922/ttyd

但这实际上是把容器外部的命令行裸露进去了,如果要裸露宿主机的命令行还须要 mount 下磁盘:

SSH 终端

ttyd 还反对 SSH 终端,命令如下:

ttyd login

这样的话,关上浏览器之后就须要 SSH 登录,输出正确的 SSH 用户名和明码后能力应用。

SSL 反对

如果你想配置 SSL 反对,即反对 HTTPS 的话,能够本人生成证书并增加对应的参数来启动 ttyd,参考链接是:https://github.com/tsl0922/tt…。

更多

下面的用法根本能满足日常须要了,如果想要理解更多用法,能够参考其 Wiki,链接是:https://github.com/tsl0922/tt…。

公网裸露

当然,咱们如果想把它公网裸露进去,还能够配合 Ngrok,比方 ttyd 运行在 8000 端口上,我能够应用 Ngrok 将其裸露进去:

ngrok http 8000

运行后果如下:

这样我就能够通过指定的 URL 拜访这个终端了,比方这里我就能够应用 https://11b4-2404-f801-8050-3… 来拜访我的终端了:

十分 Nice!

总结

好了,以上就是 ttyd 的根本应用了,有了它,咱们就能够轻松将某台机器上的终端转到 Web 上来执行了,还是十分不便有用的。

退出移动版