本文是整理如何在mac下安装和配置rz、sz工具,经跳板机访问服务器上传下载文件。
公司设置了跳板机,jumpserver,无法直连服务器,没法直接用scp上传下载文件。怎么办?同事告诉有个rz、sz的工具。才知道还有Zmodem、Xmodem、Ymodem这样的古老协议。
我开始觉得很神秘,为什么用终端连上服务器,在终端界面里敲一个命令能弹出窗口,选择文件上传。其实linux服务上目前是安装了rz、sz,那么需要本地终端也安装相应工具和配置好触发,在服务执行命令输出的时候,调用本地的rz、sz工具,就可以编码发送和收取了。
windows下XShell、SecureCRT直接支持Xmodem,Zmodem,Ymodem传输。mac下有大量的文章介绍使用iTerm2终端使用rz、sz的方法。但是有两点问题,一个是给的脚本地址要么访问不到,要么是配置触发器不对;当然也有对的,但是这尝试的代价太大不是,折腾我半天(这也是要写下本文的缘由)二是直连服务器可以,经过跳板机就不行了,话说我能直连我用scp不就行了。
废话啰嗦完,总结整理如下:
$ brew install lrzsz
这个脚本的官方地址是: iTerm2-zmodem ,这个是由iterm2的官网触发器帮助文档最后给的示例连接。
由于github开始变得“不稳定”了,我就贴一下,备用:
保存 iterm2-send-zmodem.sh
和 iterm2-recv-zmodem.sh
两个脚本到 /usr/local/bin/
。当然换个路径也可以,最后修改执行的路径就行。
iterm2-recv-zmodem.sh
的内容如下:
#!/bin/bash
# Author: Matt Mastracci ([email protected])
# AppleScript from http://stackoverflow.com/questions/4309087/cancel-button-on-osascript-in-a-bash-script
# licensed under cc-wiki with attribution required
# Remainder of script public domain
osascript -e 'tell application "iTerm2" to version' > /dev/null 2>&1 && NAME=iTerm2 || NAME=iTerm
if [[ $NAME = "iTerm" ]]; then
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)&\"\")")
else
FILE=$(osascript -e 'tell application "iTerm2" to activate' -e 'tell application "iTerm2" 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)&\"\")")
fi
if [[ $FILE = "" ]]; then
echo Cancelled.
# Send ZModem cancel
echo -e \\x18\\x18\\x18\\x18\\x18
sleep 1
echo
echo \# Cancelled transfer
else
cd "$FILE"
/usr/local/bin/rz --rename --escape --binary --bufsize 4096
sleep 1
echo
echo
echo \# Sent \-\> $FILE
fi
iterm2-send-zmodem.sh
的内容如下:
#!/bin/bash
# Author: Matt Mastracci ([email protected])
# AppleScript from http://stackoverflow.com/questions/4309087/cancel-button-on-osascript-in-a-bash-script
# licensed under cc-wiki with attribution required
# Remainder of script public domain
osascript -e 'tell application "iTerm2" to version' > /dev/null 2>&1 && NAME=iTerm2 || NAME=iTerm
if [[ $NAME = "iTerm" ]]; then
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)&\"\")")
else
FILE=$(osascript -e 'tell application "iTerm2" to activate' -e 'tell application "iTerm2" 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)&\"\")")
fi
if [[ $FILE = "" ]]; then
echo Cancelled.
# Send ZModem cancel
echo -e \\x18\\x18\\x18\\x18\\x18
sleep 1
echo
echo \# Cancelled transfer
else
/usr/local/bin/sz "$FILE" --escape --binary --bufsize 4096
sleep 1
echo
echo \# Received "$FILE"
fi
修改两个脚本为可执行:
chmod +x iterm2-recv-zmodem.sh
chmod +x iterm2-send-zmodem.sh
iTerm2的Preferences -> Profiles -> Default ->Advanced-> Triggers下Edit,新加两条触发规则:
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
注意收发别配置反了,如果对触发器正则表达式感兴趣可以看ICU’s Regular Expressions 这个正则的名称很强大叫ICU。
这个配置完了,新开一个iTerm2的窗口就可以试试执行rz,看能不能弹出选择文件窗口,如果可以就配置好了。
这一步先得感谢v2ex的这个帖子,好不容易搜到的答案。回复中的给出这篇文章为iTerm配置Zmodem文件传输(支持跳板机)非常的简单明了。唯一问题是,它里面的脚本访问不到了。
zssh(Zmodem SSH)是一个程序,用于在使用安全外壳(ssh)时以交互方式将文件传输到远程计算机。它旨在作为scp的便捷替代方法,允许您无需打开另一个会话并重新进行身份验证即可传输文件。
$ brew install zssh
没太明白zssh的原理,只知道使用zssh替代ssh登录跳板机,到服务器上可以用rz、sz上传和下载文件了。
上传文件
登录到服务器后,输入rz
就会自动弹出选择文件对话框了,选择后确定开始上传传输。
下载文件
登录到服务器后,输入sz filename
就会自动弹出选择路径对话框了,选择后确定开始下载传输。
然后我也发现,不用配置iTerm2触发器,直接用zssh的文件传输模式,也是可以工作的:
按下ctrl+@
进入了文件传输模式:
zssh>? #查看帮助
zssh>pwd #看一下本地当前目录在那
zssh>ls #看一下有那些文件
zssh>cd #切换本地目录
zssh>sz filename #上传本地机器的当前服务器当前目录
zssh>quit #退出文件传输模式
上传文件
按ctrl+@
(其实ctrl+2
也行)进入文件传输模式,直接输入sz filename
发送本地文件到服务器当前目录。
下载文件
先运行sz filename
命令,按ctrl+@
进入文件传输模式,运行rz命令即可。
其他命令
传输过程中,可以通过ctrl+c
中断传输。
使用sz -y
来覆盖远程文件,默认存在是会跳过的。
除了速度慢点,用起来还是挺方便的。