拓冰建站拓冰建站
首页 / 资讯中心 / 正文

lrzsz 全解析:基于 ZModem 的 Linux 终端文件传输神器 rz/sz 命令

做运维和开发这些年文件传输是我每天绕不开的操作。scp 用得最多但每次都记一长串路径sftp 也挺好可总要单独开个会话FTP 就别提了配置繁琐还不安全。今天想认真聊聊一个经常被低估的老牌工具——lrzsz。名字听起来有点生僻但只要是经常摸 Linux 的人多半都在 SecureCRT、Xshell 这类终端里见过它的真容输入rz回车本地文件直接传进服务器输入sz 文件名服务器文件立刻落回本地。不用记 IP、不用敲密码、不用再切换窗口一条命令来回传效率真的高。这篇我就围绕 lrzsz 的安装和使用把底层原理、常用命令、关键参数、以及我在实际运维里踩过的坑一次性讲透。不管你是刚入行的新人还是想把这工具用得更有章法的老手都能在里面找到点干货。1. 为什么到今天还在用 lrzsz协议原理与真实使用场景1.1 ZModem 协议带来的交互体验优势lrzsz 不是某家大厂出的商业软件而是一套基于 ZModem 协议的开源实现。ZModem 是 1986 年由 Chuck Forsberg 推出的串口文件传输协议比大多数人接触 Linux 的时间都早。那个年代网络带宽低、链路不稳定所以 ZModem 从设计之初就考虑了两件事传输效率要尽可能高链路出错要能快速恢复。放到今天的终端环境里ZModem 协议最直观的表现就是“无缝集成”。你在 Xshell 或 SecureCRT 的交互界面里敲下rz终端会自动识别这条命令在本机弹出一个文件选择框选完文件后进度条直接出现在命令行里。整个过程中不需要你手动确认端口、IP、用户名、密码因为这些信息都已经由当前 SSH 会话确定了。相比之下scp 每次都要重复写地址sftp 需要登录步骤ftp 还要处理被动模式和防火墙lrzsz 这条路径确实会把操作成本压到最低。另外ZModem 协议对中断的容忍度也高。文件传到一半网络抖一下链路恢复后不需要从头再来即使整个会话不小心断了重新连上再传一次也比大文件从头传要省心。这个特性在运维排障、远程处理日志文件时特别有用。1.2 和 scp 对比lrzsz 不可替代的地方很多人会问既然 scp 和 rsync 都能传文件为什么还要用 lrzsz我自己的感受是工具没有绝对的优劣只看场景匹配不匹配。scp 适合在脚本里批量同步文件rsync 适合做增量备份但它们在“人机交互”这件事上都不如 rz 和 sz 顺手。在一台服务器上临时要传个小配置文件用 scp 你得敲scp file userhost:/path如果目标服务器做了端口映射、跳板机转发命令会更长。而用 sz 的话直接sz /etc/nginx/nginx.conf本地弹窗选个目录就完事。更关键的是lrzsz 不要求远端对外开放额外端口它走的就是当前已经建立的 SSH 会话数据通道安全性上也少了一层暴露面。我见过不少网管和 DevOps 同学即使会 scp日常仍习惯用 lrzsz核心原因就一个快省脑子。它在交互场景里给到的是“所见即所得”——一个命令呼出文件选择器选了就传不需要记忆任何远端路径。1.3 这些场景下 lrzsz 是真的香跳板机和堡垒机环境。生产环境往往限制了直接 SSH 到目标服务器你得先登录跳板机再跳到内网机器。此时 scp 要额外配置代理或跳转参数而 lrzsz 完全不受影响只要当前终端会话能连上目标rz 和 sz 就能用。嵌入式开发板、路由器、交换机的维护。这类设备的系统镜像砍得很精简不一定有 scp但很多都内置了 lrzsz或者可以轻松装上。临时快速传递文件。比如现场排查问题、给同事发一个配置文件双方已经开着终端直接用 rz/sz 省去打开 SFTP 客户端的流程。Windows 和 Linux 之间的零门槛传输。Windows 自带终端不支持 ZModem但装了 Xshell、SecureCRT、MobaXterm 之后本地和远端打通就是一条命令的事。2. lrzsz 的安装一行命令装完但别忽略这些坑2.1 主流发行版用包管理安装绝大多数 Linux 发行版的软件源里都已经收录了 lrzsz安装成本几乎为零。CentOS、RHEL 这类红帽系系统用 yum 装yum install -y lrzszUbuntu 和 Debian 用 aptapt-get update apt-get install -y lrzsz其他发行版也基本是同样的玩法比如 openSUSE 用zypper install lrzszArch 用pacman -S lrzsz。安装完成后直接执行which rz which sz如果能看到/usr/bin/rz和/usr/bin/sz这样的输出说明安装成功。看到这里安装这一步其实已经结束了。但有个小细节容易踩坑国内有些 CentOS 7 的机器默认的 yum 源里可能没有 lrzsz 包或者源地址访问缓慢。这时候建议先确认源是否正常yum list installed | grep lrzsz如果没有输出再执行yum install -y lrzsz。下载速度实在不行的就换一下 yum 源或者直接从源码编译安装。Ubuntu 用户遇到 apt 装不上的情况多半是更新源缓存没跑先apt-get update再装命中率很高。2.2 源码编译安装的正确流程虽然包管理安装是首选但有些内网环境、老版本系统或者特殊架构设备上包管理器派不上用场这时候就得回到源码编译这条路。lrzsz 的源码体积很小经典版本是 0.12.20官方网站和各大镜像站点基本都能下到。wget https://ohse.de/uwe/releases/lrzsz-0.12.20.tar.gz tar zxvf lrzsz-0.12.20.tar.gz cd lrzsz-0.12.20 ./configure make make install编译前需要确认系统里有 gcc 和 make 工具否则./configure就过不去。如果报缺少 gcc先安装编译工具链# CentOS yum install -y gcc make # Ubuntu apt-get install -y build-essential源码编译完成后可执行文件默认装在/usr/local/bin/下但很多发行版对/usr/local/bin的 PATH 配置不一定包含。遇到这种情况最简单的办法是做一个软链接ln -s /usr/local/bin/lrz /usr/local/bin/rz ln -s /usr/local/bin/lsz /usr/local/bin/sz注意源码包里生成的可执行程序名字可能是lrz和lsz而不是rz和sz这一步软链接千万别漏不然你敲rz、sz依然会提示命令找不到。2.3 安装完怎么确认环境正常装完再验证一步确保命令能正常被终端会话识别rz --version sz --version正常会输出类似rz (lrzsz) 0.12.20输出版本号说明命令已可用。接着处理一个最容易忽略的环节确认你的终端模拟器支持 ZModem 协议。Xshell 和 SecureCRT 默认都支持但某些精简版终端或网页版终端是不支持的此时敲rz后屏幕会卡住或者直接报“未收到请求”。解决办法很简单换用 Xshell、SecureCRT、MobaXterm 这类主流终端连接工具。3. rz 上传文件从本地把数据送到服务器的完整操作3.1 最简单的 rz 用法几秒钟搞定上传rz 这个命令名是 “receive Zmodem” 的缩写从本地接收文件到远端也就是我们常说的“上传到服务器”。用起来极其简单cd /tmp rz敲下回车后当前终端会进入等待状态同时本机弹出文件选择器。在弹出的对话框里选中一个或多个文件确认后就开始上传。默认情况下文件会传到当前工作目录所以使用前最好先cd到你真正想存放文件的目录否则上传完还要做一次mv多一道工序。需要留意的是rz 的弹窗是由本地终端客户端负责的。Xshell 的弹窗会在任务栏闪烁SecureCRT 是居中弹窗MobaXterm 也有自己的文件选择器。第一次用找不到弹窗的同学往往是因为终端被最小化或者弹窗藏在当前窗口后面注意到这点就不会觉得“卡死了”。3.2 掌握 rz 的关键参数覆盖和编码都不怕rz 虽然简单但几个参数在实际工作中很实用。rz -y-y表示覆盖本地同名目录下的现有文件。不加它的话若服务器当前目录里已经存在同名文件会弹一个确认提示“xx: already exists. Overwrite? (y/n)”。单文件时倒还好批量上传遇到同名就要逐条确认比较耽误时间。rz -e-e表示传输过程中对控制字符做转义处理。老终端或者特殊环境下某些文件内容可能包含会被误当作用户输入的字节加上-e会更稳妥。rz -b-b是二进制模式传输。通常处理文本文件没差别但传压缩包、镜像、程序这类二进制文件时建议加上这个参数能避免部分终端把文件内容当成文本做转换损坏数据。我自己的习惯是默认这么敲rz -bye三个参数一把梭覆盖文件、二进制传输、转义控制符。虽然不是每次都需要但配上这套参数基本上能应付各种终端环境下的上传需求。3.3 上传目录的两种思路rz 本身不支持直接传目录这是它的一个局限。我在实际工作中摸索出两种路线。第一种是先把目录打包再传传到服务器后解压# 本地操作 tar czf mydata.tar.gz mydata/ # 在服务器对应目录执行 rz -y # 选择 mydata.tar.gz tar zxf mydata.tar.gz这种方式通用性最强也适合目录结构复杂、文件数量多的情况。第二种方式是直接在 rz 的文件选择器里多选文件上传后在服务器上手动建目录归置。适用于文件数量不多、结构简单的小场景。两种方式没有绝对好坏核心思路是理解 rz 的边界——它是“文件级”传输工具目录结构需要自己组织好。4. sz 下载文件从服务器拉文件的正确姿势4.1 sz 基本用法与保存逻辑sz 是 “send Zmodem” 的缩写从远端发送文件到本地也就是我们常说的“下载”。用法一样简单sz /var/log/nginx/access.log回车之后本地终端会弹出保存对话框让你确认保存路径。确认后文件就落到本地了。和 rz 相对应sz 默认把文件保存到你本地当前目录或上次保存的位置不同终端client的表现略有差异。Xshell 会弹窗让你选保存路径SecureCRT 也会弹MobaXterm 则是默认保存到某个指定的下载目录。一个我自己常用的技巧在敲 sz 前先输入本地想要保存的目录然后通过终端的“设置默认下载目录”功能固定下来以后每次 sz 就少一步确认操作。这个功能在 Xshell 和 SecureCRT 的会话属性里都能找到。这样一来下载文件就像复制粘贴一样自然。4.2 批量下载和文件名处理sz 可以把多个文件一次性传下来不需要逐个执行sz /etc/passwd /etc/group /etc/hostname一条命令对应多个文件终端会依次弹出保存确认或者根据设置自动保存到统一目录。文件名默认保持服务器端的名字所以服务器上中文文件名或者带特殊字符的文件名在部分终端里保存时会遇到编码问题。后面我会专门说乱码的处理。sz 同样支持-y参数sz -y /var/log/nginx/access.log这里的-y表示本地存在同名文件时自动覆盖不用每个文件都弹一次确认。批量下载时加上这个参数体验提升非常明显。4.3 Xshell 和 SecureCRT 里的不同细节虽然 Xshell 和 SecureCRT 都支持 ZModem但在文件下载的默认行为上略有差异。Xshell 首次执行 sz 时会弹窗询问保存位置之后默认记住你上次选择的目录SecureCRT 的默认下载位置需要提前在“会话选项 - ZModem - 下载文件夹”里设置否则每次都可能弹到自己的用户目录里找起来费劲。还有个特别实用的小技巧SecureCRT 里可以通过rz和sz的可执行路径设置指定终端调用的本地程序但通常保持默认就行不用刻意改动。关键是记得“传输目录 覆盖确认 编码设置”这三件事日常使用就不会出幺蛾子。5. 常见报错和排查过程实录5.1 命令找不到、传输中断等高频问题报错bash: rz: command not found这个最常见原因就是 lrzsz 还没安装。按第 2 节的安装步骤操作就行。源码编译后命令找不到的记得检查/usr/local/bin有没有进 PATH没有就建软链接。执行 rz 后卡住不弹文件选择窗口多半是当前终端不支持 ZModem 协议。常见的坑是在 tmux 或 screen 里执行 rz。tmux 这类多路复用终端会拦截掉部分转义序列导致 ZModem 交互失效。解决办法有两个一是退出 tmux 会话回到原生终端里执行二是在宿主机终端已经支持 ZModem 的前提下把本地系统的 zmodem 集成配置好才能从 tmux 里弹窗。实际运维里最省事的还是第一个方案。传输过程中途卡死排查思路先确认本地磁盘空间是否足够再看服务器端目录写权限。df -h ls -ld /目标目录如果两边都没有问题试着把文件放到纯英文路径下再传一些终端对带空格和特殊字符的路径支持不够好容易在传输过程中断开。5.2 中文乱码的成因与解决中文文件名乱码是 lrzsz 使用里讨论度非常高的问题。根源在于 ZModem 协议本身不关心字符编码而终端模拟器在接收文件时会按照自己的默认编码去解析文件名。简单说服务器端文件名是 UTF-8 编码Windows 终端默认用 GBK 解析就变成乱码了。排查方法很直接# 服务器端先看一眼文件名 ls -l /path/to/file如果服务器端显示正常但下载到 Windows 后乱码那就是终端编码设置问题。在 Xshell 里把“外观 - 编码”改成 UTF-8重新 sz 一次多半就能解决。已经乱码的文件可以手动改名或重新传一次。有一个更可靠的规避方式上传或下载带中文名的文件前先把文件名改成拼音或英文字母。这不是绕弯子而是长期维护 Linux 服务器后慢慢养成的习惯。文件名越“纯粹”跨平台传输就越省心。5.3 大文件和特殊文件传输的取舍lrzsz 是通过串口协议模拟出来的传输机制本质上并不是为大文件设计的。传到几百 MB 级别的文件时速度会明显下降而且如果网络出现抖动传输失败的概率也会上升。我的做法是小于 50 MB 的文件直接用 rz 和 sz省事。50 MB 到 200 MB 之间的可以先 gzip 压缩再传减少体积或者直接改用 scp。大于 200 MB 的文件老老实实用 scp、rsync 或者搭建临时的 HTTP 服务来下载别跟终端工具较劲。ZModem 协议虽然支持断点重传但 lrzsz 在中断后重新执行时通常还是从头开始传并不会真正从断点处接续。所以大文件场景下它的“续传”优势其实有限这也是我建议大文件换用 scp 的原因。另外再提一个特殊文件类型空文件。由于 ZModem 协议的特性空文件传输后可能在目标端不会被创建或者创建后大小为 0这其实是正常的。如果你需要精确保留文件属性、权限和空文件那还是 tar 打包之后再传更保险。整个 lrzsz 用下来我最深的体会是工具不一定要“大而全”只要在自己的使用场景里足够顺手就是好工具。我在日常运维中已经习惯了进入服务器先看一眼有没有 lrzsz没有就顺手装上这个小习惯省下了大量来回传文件的碎片时间。最后还有一种取巧的用法分享给你如果你和同事共用一台跳板机想快速把一份配置发给对方直接传到公共目录后用sz发出去就行比起微信、邮件临时传文件这种方式在数据管控上更安全可控。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门