之前我寫過一篇《萬物皆可 API》,這個項目就是把一些腳本的執行結果輸出到了網頁裡面。
但是這個還是有很多改進空間,比如說 UI 能好看些,甚至能執行交互命令該多好,最後思來想去,它的究極形態不就是一個 Web 版的 Terminal (終端)嗎?
然後本來我還想着對項目進行改造來着,但是想想,最終如果要改造成一個 Web 版的 Terminal,這個肯定已經有開源實現了。
於是我就開始搜,最後搜到幾個還不錯的。
Web Terminal經過一番試用,我個人首推的還是 ttyd,其他的幾個要麼是基於 SSH 的,要麼不怎麼好用或停止維護了。
下面我就來介紹下 ttyd 的簡單用法。
安裝安裝其實非常簡單,我用的是 Mac,所以用 HomeBrew 直接安裝即可:
brew install ttyd如果你用的是 Windows、Linux,依然也可以支持,安裝可以參考 https://github.com/tsl0922/ttyd#installation 章節。
使用ttyd 支持不少功能配置,完整命令如下:
ttyd is a tool for sharing terminal over the webUSAGE: ttyd [options] <command> [<arguments...>]VERSION: 1.6.3OPTIONS: -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 exitVisit 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/ttyd/wiki/SSL-Usage。
更多上面的用法基本能滿足日常需要了,如果想要了解更多用法,可以參考其 Wiki,鏈接是:https://github.com/tsl0922/ttyd/wiki/Example-Usage。
公網暴露當然,我們如果想把它公網暴露出來,還可以配合 Ngrok,比如 ttyd 運行在 8000 端口上,我可以使用 Ngrok 將其暴露出來:
ngrok http 8000運行結果如下:

這樣我就可以通過指定的 URL 訪問這個終端了,比如這裡我就可以使用 https://11b4-2404-f801-8050-3-bf-00-55.ngrok.io/ 來訪問我的終端了:

非常 Nice!
總結好了,以上就是 ttyd 的基本使用了,有了它,我們就可以輕鬆將某台機器上的終端轉到 Web 上來執行了,還是非常方便有用的。

End
崔慶才的新書《Python3網絡爬蟲開發實戰(第二版)》已經正式上市了!書中詳細介紹了零基礎用 Python 開發爬蟲的各方面知識,同時相比第一版新增了 JavaScript 逆向、Android 逆向、異步爬蟲、深度學習、Kubernetes 相關內容,同時本書已經獲得 Python 之父 Guido 的推薦,目前本書正在七折促銷中!
內容介紹:《Python3網絡爬蟲開發實戰(第二版)》內容介紹
掃碼購買