macOS下使用ZMODEM协议上传/下载文件

有时候,我们ssh登录服务器操作(甚至经过跳板机),然后这个时候,我们想下载、上传一个文件,就必须重启启动一个终端,运行scp命令。这个非常的繁琐,而且要上传、下载的目录也需要自己copy,有没有办法能够在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:

brew cask info iterm2-beta

然后在本地安装sz和rz命令:

 brew install lrzsz

然后,下载给iTerm2用的rz、sz脚本:

curl -L -o /usr/local/bin/iterm2-recv-zmodem.sh https://github.com/RobberPhex/iterm2-zmodem/raw/master/iterm2-recv-zmodem.sh
curl -L -o /usr/local/bin/iterm2-send-zmodem.sh https://github.com/RobberPhex/iterm2-zmodem/raw/master/iterm2-send-zmodem.sh
chmod a+x /usr/local/bin/iterm2-recv-zmodem.sh /usr/local/bin/iterm2-send-zmodem.sh

修改自mmastrac/iterm2-zmodem,但是添加了buffersize限制,防止在传输大文件的时候内存爆掉。

最后,配置iTerm2的触发器(点击菜单的Profiles,选择某个profile之后然后继续选择advanced → triggers,添加triggers),配置器触发如下:

Regular expression: rz waiting to receive.\*\*B0100
Action: Run Silent Coprocess
Parameters: /usr/local/bin/iterm2-send-zmodem.sh
Instant: checked

Regular expression: \*\*B00000000000000
Action: Run Silent Coprocess
Parameters: /usr/local/bin/iterm2-recv-zmodem.sh
Instant: checked

最后测试:

下载文件-选择存放位置
下载文件-结果
上传文件-选择文件上传
上传文件-结果

参考资料:

1 thought on “macOS下使用ZMODEM协议上传/下载文件

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.