lrzsz 原理
官方介绍:https://www.ohse.de/uwe/software/lrzsz.html
下载文件
在服务器上执行 sz(Send by ZMODEM),先在终端上输出 **B00000000000000,然后客户端在终端发送指令,表示拒绝,还是接收(接收的话,就在客户端运行 rz 指令与服务端交互)上传文件
在服务器上执行 rz(Receive by ZMODEM),先在终端上输出 rz waiting to receive.**B0100000023be50,然后客户端发送指令,表示取消,还是上传(上传的话,在客户端运行 sz 命令与服务端交互)。
可以看到在上述流程中,对 Terminal 的要求就是,遇到特殊指令,触发对应的操作(执行本地命令)
由于 macOS 自带的 Terminal.app 不支持这个,所以网上大部分教程都是使用 iTerm2
安装lrzsz
brew install lrzsz
# 此时iterm2还不能使用rz、sz命令,必须安装两个脚本
cd /usr/local/bin
wget https://raw.githubusercontent.com/RobberPhex/iterm2-zmodem/master/iterm2-recv-zmodem.sh
wget https://raw.githubusercontent.com/RobberPhex/iterm2-zmodem/master/iterm2-send-zmodem.sh
# 赋予这两个文件可执行权限
chmod 755 /usr/local/bin/iterm2-*
设置 Iterm2 的 Tirgger 特性
# 拷贝以下键值复制进去即可
rz waiting to receive.\*\*B0100
\*\*B00000000000000
/usr/local/bin/iterm2-send-zmodem.sh
/usr/local/bin/iterm2-recv-zmodem.sh
问题升级
正常配置完成之后,我们使用ssh远程命令登录服务器就可以使用rz、sz命令,但是生产服务器我们常常会使用expect脚本登录,使用过程中发现无法使用rz、sz命令,解决方案如下
本地写个通用脚本如下,例如/tmp/expect.sh,并赋予可执行权限,expect脚本介绍
vi /tmp/expect.sh
# 脚本内容如下
#!/bin/sh
export LC_CTYPE=en_US
#expect脚本所在位置
filepath=$1
if [ -f $filepath ]; then
expect $filepath
fi
# 修改文件可执行权限
chmod -R 755 /tmp/expect.sh
远程服务器expect脚本
vi /tmp/ssh.sh
# 脚本内容如下
#!/usr/bin/expect
set user root
set host 192.168.1.1
set password root@123
spawn ssh -A $user@$host
expect "*assword:*"
send "$password\r"
interact
expect eof
如图配置好,就可以远程服务器并使用rz、sz了。