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
2
3
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),配置器触发如下:

1
2
3
4
5
6
7
8
9
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

最后测试下:

下载文件-选择存放位置

下载文件-结果

上传文件-选择文件上传

上传文件-结果


参考资料:

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

https://www.robberphex.com/use-zmodem-at-macos/

作者

Robert Lu

发布于

2019-05-01

许可协议

评论