1. Linux sz命令概述
sz命令是Linux系统中一个极为实用的文件传输工具,属于lrzsz软件包的一部分。它通过串行端口(serial port)实现与远程设备的文件传输,特别适合在没有网络连接或网络环境受限的情况下进行文件交换。
我第一次接触sz命令是在调试嵌入式设备时,当时设备只有串口可用,网络功能尚未配置。sz命令配合minicom完美解决了固件传输的问题,从此成为我工具箱中的常备武器。
2. sz命令安装与配置
2.1 安装lrzsz软件包
在主流Linux发行版中,安装非常简单:
bash复制# Debian/Ubuntu系
sudo apt-get install lrzsz
# RHEL/CentOS系
sudo yum install lrzsz
# Arch Linux
sudo pacman -S lrzsz
安装完成后,系统会增加sz(发送)和rz(接收)两个关键命令。这里有个小技巧:如果遇到依赖问题,可以尝试先更新软件源:
bash复制sudo apt-get update && sudo apt-get install lrzsz
2.2 终端模拟器配置
要使用sz命令,终端模拟器需要支持ZMODEM协议。常见的终端工具配置如下:
-
Minicom:
在配置菜单(Ctrl+A → O)中确保"File transfer protocols"包含:code复制zmodem /usr/bin/sz -vv -
SecureCRT:
在会话选项 → 文件传输中启用ZMODEM,设置发送命令为sz --escape -
Xshell:
在属性 → 串口中勾选"使用ZMODEM接收文件"
提示:如果传输中断,检查终端设置中的流控制(Flow Control)是否设为RTS/CTS
3. sz命令核心用法详解
3.1 基本传输语法
最基础的发送单个文件命令:
bash复制sz filename
实际使用时我发现几个实用参数组合:
bash复制sz -e filename # 转义控制字符(推荐默认使用)
sz -b filename # 二进制模式传输
sz -y filename # 覆盖已存在文件
sz -vv filename # 显示详细调试信息
3.2 多文件传输技巧
传输多个文件有两种方式:
bash复制# 方式1:逐个指定
sz file1 file2 file3
# 方式2:使用通配符
sz *.log
但要注意通配符在远程shell中的展开问题。我的经验是先在本地测试:
bash复制ls *.log # 确认匹配的文件
3.3 传输中断与恢复
当传输意外中断时,可以这样恢复:
bash复制sz -c filename # 继续上次传输
实测中我发现几个关键点:
- 两端必须使用相同的文件名
- 原文件不能被修改
- 最好使用相同的传输参数
4. 实战案例解析
4.1 案例1:嵌入式设备日志收集
假设我们需要从开发板获取调试日志:
bash复制# 开发板端生成日志
dmesg > debug.log
ls -lh debug.log # 确认文件大小
# 发送日志到主机
sz -e debug.log
常见问题处理:
- 如果文件较大(>10MB),建议先压缩:
bash复制tar czf logs.tar.gz *.log sz logs.tar.gz - 传输速度慢时,可以调整串口波特率(需两端一致)
4.2 案例2:批量传输配置文件
在路由器配置备份场景:
bash复制# 打包配置文件
tar czf config_backup_$(date +%Y%m%d).tar.gz /etc/network/
# 交互式选择文件传输
sz -y *.tar.gz
注意:使用-y参数自动覆盖时务必确认文件名,避免意外覆盖重要文件
4.3 案例3:自动化脚本集成
在CI/CD流程中自动获取构建产物:
bash复制#!/bin/bash
build_output="firmware_$(git rev-parse --short HEAD).bin"
make && sz -b "$build_output"
关键技巧:
- 使用-b确保二进制文件完整传输
- 文件名包含版本信息便于追踪
- 添加错误处理逻辑:
bash复制if ! sz "$build_output"; then echo "传输失败!" >&2 exit 1 fi
5. 高级应用与性能优化
5.1 传输速度提升方案
默认设置下sz的传输速度可能较慢,可以通过以下方式优化:
-
调整块大小:
bash复制sz -B 2048 filename # 使用更大的块大小实测数据对比:
块大小 传输时间(10MB文件) 128B 4分32秒 1024B 1分15秒 2048B 38秒 -
压缩传输:
bash复制
gzip -c file | sz --zmodem -b - > file.gz -
硬件流控制:
确保串口设置启用了RTS/CTS:bash复制stty -F /dev/ttyS0 crtscts
5.2 安全传输实践
虽然sz通常用于内网环境,但仍需注意:
- 校验文件完整性:
bash复制# 发送端 md5sum file > file.md5 sz file file.md5 # 接收端 md5sum -c file.md5 - 敏感文件加密:
bash复制
gpg -c file && sz file.gpg
5.3 替代方案对比
当网络可用时,可以考虑其他工具:
| 工具 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| sz/rz | 无需网络 | 速度较慢 | 串口环境 |
| scp | 加密传输 | 需要SSH配置 | 有网络连接 |
| nc | 简单直接 | 无加密 | 临时传输 |
| rsync | 增量同步 | 配置复杂 | 定期备份 |
6. 故障排查指南
6.1 常见错误代码
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 传输中断 | 流控制未启用 | 检查CRTSCTS设置 |
| 文件损坏 | 文本模式传输二进制 | 使用-b参数 |
| 无法启动传输 | 终端未配置ZMODEM | 检查终端模拟器设置 |
| 权限被拒绝 | 目标目录不可写 | 检查接收端目录权限 |
| 文件名乱码 | 字符集不匹配 | 统一使用UTF-8编码 |
6.2 调试技巧
启用详细日志:
bash复制sz -vvv file 2> sz.log
关键日志信息解读:
Starting zmodem transfer表示协议启动成功Bytes received显示实时传输进度Transfer complete确认完成
6.3 环境检查清单
遇到问题时按顺序检查:
- 两端是否都安装了lrzsz
- 终端模拟器是否支持ZMODEM
- 串口连接是否稳定(dmesg | grep tty)
- 文件权限是否正确(ls -l)
- 磁盘空间是否足够(df -h)
7. 使用心得与最佳实践
经过多年使用,我总结出以下经验:
-
文件名处理:
- 避免使用空格和特殊字符
- 中文文件名建议先重命名
- 长文件名可能在某些终端出现问题
-
传输监控:
bash复制watch -n 1 'ls -lh /tmp/receive'可以实时观察接收进度
-
批处理技巧:
创建发送脚本send_all.sh:bash复制#!/bin/bash for file in "$@"; do echo "Sending $file..." sz -b "$file" || break done -
历史记录:
在~/.bashrc中添加:bash复制alias sz='sz -e -b' export RSZ_OPTIONS="-v -e -b"
最后分享一个真实案例:曾用sz通过9600波特率的串口传输200MB的系统镜像,耗时近8小时。后来改用硬件加速的USB转串口适配器并将波特率提高到115200,时间缩短到45分钟。这个经历让我深刻认识到硬件选择对传输效率的影响