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画龙点睛之lrzsz上传下载文件的更多相关文章
- Linux使用lrzsz上传下载文件
1.当然是要安装lrzsz这个程序 yum -y install lrzsz 2.该程序的使用 //下载文件 sz filepath.ext//文件会默认下载到系统的Downloads目录 //上传文 ...
- Mac 10.12下iTerm2使用lrzsz上传下载文件
1.下载脚本: cd /usr/local/bin wget https://raw.githubusercontent.com/mmastrac/iterm2-zmodem/master/iterm ...
- rz和sz上传下载文件工具lrzsz
######################### rz和sz上传下载文件工具lrzsz ####################################################### ...
- linux使用命令上传下载文件 -- lrzsz
之前都是用Xftp工具在本地和linux系统之间上传下载文件,最近觉得麻烦,因为平时用Xshell连接,要传输文件的时候还要额外使用别的工具,下面是lrzsz的安装和简单的使用过程: 详细的使用可以s ...
- linux上很方便的上传下载文件工具rz和sz
linux上很方便的上传下载文件工具rz和sz(本文适合linux入门的朋友) ##########################################################&l ...
- 向linux服务器上传下载文件方式收集
向linux服务器上传下载文件方式收集 1. scp [优点]简单方便,安全可靠:支持限速参数[缺点]不支持排除目录[用法] scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ...
- rz和sz上传下载文件
安装软件包 yum install lrzsz 上传文件,输入rz选择文件上传(可以按住shift键多选) # rz sz 下载文件到本地,选择保存文件夹 # sz dd xshell设 ...
- SecureCRT上传下载文件教程(Zmodem使用教程)
SecureCRT是一个仿真终端连接工具.它可以方便的连接SSH服务器,远程管理Linux.同时,它还能使用多种协议方便的上传下载文件.其中Zmodem是SecureCRT支持比较好的一种古老的上传下 ...
- 使用Xshell上传下载文件
很多时候我们需要在Windows跟Linux之间,或者Linux跟Linux之间传文件,这里我们讲的是使用Xshell实现文件上传下载. 一.使用rz,sz实现Windows,linux上传下载 1. ...
随机推荐
- csps模拟测试110
好久没写博客了,主要是太懒了,这次考试其实状态还算好. 考试的时候半小时左右打完T1T2,先没打T2对拍,想了想T3,大概有了一个bitset的思路,回去补上了T2的对拍. 然后T3想了一些东西: 三 ...
- nmap学习笔记-扫描格式
习惯性的前言: 之前曾经零零星星的学习过一段时间的nmap,但是因为用的少,后续有慢慢的放下了,这次正好借着工作上的机会重新学习一下nmap,并记录在此. nmap端口状态: open:应用程序在该端 ...
- git命令--subtree
目录 git命令--subtree subtree 主要命令 git subtree add --prefix=<prefix> <commit> git subtree ...
- day 2 上午 挂饰 背包
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> us ...
- Havok Physics 2012(2)
目录 Havok Physics 2012 Chapter 2. Creating a Simulation 创建一个模拟世界 1. Creating Physics 2012 Objects Hav ...
- 实现支持多用户在线的FTP程序(C/S)
1. 需求 1. 用户加密认证 2. 允许多用户登录 3. 每个用户都有自己的家目录,且只能访问自己的家目录 4. 对用户进行磁盘分配,每一个用户的可用空间可以自己设置 5. 允许用户在ftp ser ...
- 《计算机网络 自顶向下方法》 第2章 应用层 Part1
常见的应用层协议有哪些? HTTP(HyperText Transfer Protocol):超文本传输协议 FTP(File Transfer Protocol):文件传输协议 SMTP(Sim ...
- [JQuery] JQuery学习笔记
1.2019年10月20日14:43:48 学习HOW2J. 2.JQuery是一个javascript的框架,是对javascript的一种封装, 通过JQuery可以非常方便的操作html的元素 ...
- hdu 3342 Legal or Not (topsort)
Legal or NotTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- epoll介绍及使用
小程序功能:简单的父子进程之间的通讯,子进程负责每隔1s不断发送"message"给父进程,不需要跑多个应用实例,不需要用户输入. 首先上代码 #include<assert ...