1. 程式人生 > >WebSSH畫龍點睛之lrzsz上傳下載檔案

WebSSH畫龍點睛之lrzsz上傳下載檔案

本篇文章沒有太多的原始碼,主要講一下實現思路和技術原理

當使用Xshell或者SecureCRT終端工具時,我的所有檔案傳輸工作都是通過lrzsz來完成的,主要是因為其簡單方便,不需要額外開啟sftp之類的工具,通過命令就可輕鬆搞定,在用了WebSSH之後一直在想,這麼便捷的操作WebSSH能夠實現嗎?

答案是肯定的,能實現!這要感謝這個古老的檔案傳輸協議:zmodem

zmodem採用串流的方式傳輸檔案,是xmodem和ymodem協議的改良進化版,具有傳輸速度快,支援斷點續傳、支援完整性校驗等優點,成為目前最流行的檔案傳輸協議之一,也被眾多終端所支援,例如Xshell、SecureCRT、item2等

優點之外,zmodem也有一定的侷限性,其中之一便是隻能可靠地傳輸大小不超過4GB的檔案,但對於大部分場景下已夠用,超大檔案的傳輸一般也會尋求其他的傳輸方式

lrzsz就是基於zmodem協議實現的檔案傳輸,linux下使用非常方便,只需要一個簡單的命令就可以安裝,例如centos系統安裝方式如下

yum install lrzsz

安裝完成後就可以通過rz命令上傳檔案,或者sz命令下載檔案了,這麼說上傳或下載其實不是很準確,在zmodem協議中,使用receive接收和send傳送來解釋更為準確,無論是receive還是send都是由服務端來發起的

rz的意思為recevie zmodem,服務端來接收資料,對於客戶端來說就是上傳

sz的意思是send zmodem,服務端來發送資料,對於客戶端來說就是下載

檔案的傳輸需要服務端和客戶端都支援zmodem協議,服務端通過安裝lrzsz實現了對zmodem協議的支援,Xshell和SecureCRT也支援zmodem協議,所以他們能通過rz或sz命令實現檔案的上傳和下載,那麼Web瀏覽器要如何支援zmodem協議呢?

我們所使用的終端工具xterm.js在3.x版本提供過zmodem擴充套件外掛,但很可惜在4.x版本中已經停止支援了,還好給xterm.js提供zmodem擴充套件外掛的作者開源了一個專案:zmodemjs,用來提供瀏覽器Web對zmodem協議的支援,且能很好的跟xterm.js工具相結合,有了zmodemjs我們就可以通過瀏覽器與終端互動,呼叫系統rzsz命令實現檔案上傳下載了

需要注意的是zmodem是個二進位制協議,只支援二進位制流,所以通過websocket傳輸的資料必須是二進位制的,在django的channel中可以通過指定傳送訊息的型別為bytes_data來實現websocket傳輸二進位制資料,這是後端實現的核心

websocket.send(bytes_data=data)

配合zmodemjs的前端實現,最終的效果如下

當我完成了Web上使用rzsz上傳下載檔案功能後,遇到了一個棘手的問題,無論是監控還是錄影,在sz下載時會將下載的檔案二進位制顯示在螢幕上,這主要是因為通過zmodemjs可以解析webssh中的二進位制檔案流為檔案,而監控和錄影不行解析,這就需要監控和錄影時過濾掉檔案二進位制流,起初我想通過分析二進位制流來判斷這段流究竟是檔案還是文字,但最後發現無法準確識別,一個稍微靠譜的方法是對binary流進行decode解碼,但不能保證100%準確

又深入研究了zmodem協議是如何實現識別的,發現了zmodem的實現原理

在伺服器上執行sz命令後,會先輸出**B00000000000000這樣的內容,標識檔案下載開始,當檔案下載結束後會輸出OO,取這兩個特殊標記之間的二進位制流組合成檔案,就是要下載的完整檔案

rz命令類似,會在開始時輸出rz waiting to receive.**0100000023be50標記,知道了這個規則,就只需要在傳送給監控和錄影的資料中去除sz標記之間的內容就可以了,問題完美解決,算是給WebSSH系列畫上了句號


相關文章推薦閱讀:

  • 堡壘機的核心武器:WebSSH錄影實現
  • 堡壘機WebSSH進階之實時監控和強制下線