mac下使用rz和sz与服务器上传下载文件

本文是整理如何在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不就行了。

废话啰嗦完,总结整理如下:

1、安装rz、sz

$ brew install lrzsz

2、配置iTerm2的触发器

这个脚本的官方地址是: iTerm2-zmodem ,这个是由iterm2的官网触发器帮助文档最后给的示例连接。

由于github开始变得“不稳定”了,我就贴一下,备用:

保存 iterm2-send-zmodem.shiterm2-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,看能不能弹出选择文件窗口,如果可以就配置好了。

3、安装zssh(Zmodem SSH)

这一步先得感谢v2ex的这个帖子,好不容易搜到的答案。回复中的给出这篇文章为iTerm配置Zmodem文件传输(支持跳板机)非常的简单明了。唯一问题是,它里面的脚本访问不到了。

zssh(Zmodem SSH)是一个程序,用于在使用安全外壳(ssh)时以交互方式将文件传输到远程计算机。它旨在作为scp的便捷替代方法,允许您无需打开另一个会话并重新进行身份验证即可传输文件。

$ brew install zssh

没太明白zssh的原理,只知道使用zssh替代ssh登录跳板机,到服务器上可以用rz、sz上传和下载文件了。

上传文件

登录到服务器后,输入rz就会自动弹出选择文件对话框了,选择后确定开始上传传输。

下载文件

登录到服务器后,输入sz filename 就会自动弹出选择路径对话框了,选择后确定开始下载传输。

4、直接使用zssh的文件传输模式

然后我也发现,不用配置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 来覆盖远程文件,默认存在是会跳过的。

除了速度慢点,用起来还是挺方便的。

你可能感兴趣的:(mac下使用rz和sz与服务器上传下载文件)