有时候,我们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/