最近有将本地文件跨认证机和中控机传向服务器的需求,scp当然跪了,无法使用,就找到这个更好用的方法了,分享一波。

rz,sz命令传输文件,比使用scp要方便得多,特别是在图形界面打开终端,SSH登陆到远程机器需要传输文件的时候。
但是MacOS里Terminal.app并不支持Zmodel传输,好在iTerm2具备较强的扩展性可以通过简单的配置支持Zmodem传输。

安装配置

安装lrzsz

1
brew install lrzsz

如果安装遇到错误的话,使用以下方法:

1
curl -k https://ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz -o lrzsz-0.12.20.tar.gz

将下载的文件放到 ~/Library/Caches/Homebrew 目录下

1
brew install lrzsz

安装iterm2-zmodem文件

iterm2-recv-zmodem.shiterm2-send-zmodem.sh 脚本保存在 /usr/local/bin/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/bin/bash
# iterm2-recv-zmodem.sh

FILE=`osascript -e 'tell application "iTerm" to activate' -e 'tell application "iTerm" to set thefile to choose folder with prompt "Choose a folder to place received files in"' -e "do shell script (\"echo \"&(quoted form of POSIX path of thefile as Unicode text)&\"\")"`

if [[ $FILE = "" ]]; then
echo Cancelled.
# Send ZModem cancel
echo -e \\x18\\x18\\x18\\x18\\x18
echo \# Cancelled transfer
echo
else
echo $FILE
cd "$FILE"
/usr/local/bin/rz
echo \# Received $FILE
echo
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
# iterm2-send-zmodem.sh

FILE=`osascript -e 'tell application "iTerm" to activate' -e 'tell application "iTerm" to set thefile to choose file with prompt "Choose a file to send"' -e "do shell script (\"echo \"&(quoted form of POSIX path of thefile as Unicode text)&\"\")"`

if [[ $FILE = "" ]]; then
echo Cancelled.
# Send ZModem cancel
echo -e \\x18\\x18\\x18\\x18\\x18
echo \# Cancelled transfer
echo
else
echo $FILE
/usr/local/bin/sz "$FILE"
echo \# Received $FILE
echo
fi

注意添加脚本可执行权限:

1
2
chmod +x iterm2-send-zmodem.sh
chmod +x iterm2-recv-zmodem.sh

在iTerm 2添加Triggers

打开iTerm的Preferences,或者使用 command + , ,点进Profiles项,Advanced项,进入Tirggers,点击Edit,添加两条规则:

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

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

至此,所有配置完成。下面就可以使用黑科技来传输文件了。

使用方法

将文件传到远端服务器

在远端服务器上输入 rz ,回车
选择本地要上传的文件
等待上传

从远端服务器下载文件

在远端服务器输入 sz filename filename1 … filenameN

选择本地的存储目录
等待下载

PS:远端服务器也需要安装lrzsz。
centOS安装方法: yum -y install lrzsz

经过跳板机rz上传稍大文件失败及解决方案

  • 失败原因
    经过跳板机之后直接rz、sz一个稍大的文件会在上传一部分后退出并显示一堆乱码,这是因为这中间有控制字符的原因。

  • 解决方案
    加参数-e忽略控制字符

rz -e 和 sz -e