macOS下使用ZMODEM协议上传/下载文件
有时候,我们ssh登录服务器操作(甚至经过跳板机),然后这个时候,我们想下载、上传一个文件,就必须重启启动一个终端,运行scp命令。这个非常的繁琐,而且要上传、下载的目录也需要自己复制粘贴,有没有办法能够在ssh会话中上传、下载文件呢?
查了下,还真有这么一个协议,叫ZMODEM。
原理
下载文件
在服务器上执行sz(Send by ZMODEM),先在终端上输出**B00000000000000
,然后客户端在终端发送指令,表示拒绝,还是接收(接收的话,就在客户端运行rz指令与服务端交互)
上传文件
在服务器上执行rz(Receive by ZMODEM),先在终端上输出rz waiting to receive.**B0100000023be50
,然后客户端发送指令,表示取消,还是上传(上传的话,在客户端运行sz命令与服务端交互)。
可以看到在上述流程中,对Terminal的要求就是,遇到特殊指令,触发对应的操作(执行本地命令)。
遗憾的是,我一直使用的、macOS自带的Terminal.app不支持这个,所以我只能放弃Terminal.app,使用iTerm2(v3.3.0beta5)了。
如何配置
首先,安装iTerm2:
1 | brew cask info iterm2 |
然后在本地安装sz和rz命令:
1 | brew install lrzsz |
然后,下载给iTerm2用的rz、sz脚本:
1 | curl -L -o /usr/local/bin/iterm2-recv-zmodem.sh https://github.com/RobberPhex/iterm2-zmodem/raw/master/iterm2-recv-zmodem.sh |
_修改自mmastrac/iterm2-zmodem,但是添加了buffersize限制,防止在传输大文件的时候内存爆掉。
最后,配置iTerm2的触发器(点击菜单的Profiles,选择某个profile之后然后继续选择advanced → triggers,添加triggers),配置器触发如下:
1 | Regular expression: rz waiting to receive.\*\*B0100 |
最后测试下:
参考资料:
macOS下使用ZMODEM协议上传/下载文件