转: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(https://iterm2.com/downloads.html):

brew cask info iterm2

然后在本地安装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

表格版更清晰:

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

参考资料:

http://codelife.me/blog/2013/03/02/zmodem-integration-for-iterm2/
https://www.iterm2.com/documentation-triggers.html
https://github.com/mmastrac/iterm2-zmodem
https://www.hi-linux.com/posts/9916.html

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

Archives