Java 服务器: Linux-yum在线安装与lrzsz文件传输

Java框架上手实践之yum在线安装: 自动依赖解析原理与lrzsz文件传输实战

纲要

本文以 lrzsz 的安装为切入点,系统讲解 yum 这一前端软件包管理器的工作机制,并说明为什么在已有图形化上传工具的情况下,仍然必须掌握 rz / sz 命令。

  • yum 是什么
    • 全称 Yellow dog Updater, Modified
    • 基于 rpm,但能自动下载并处理依赖关系
  • yum 的核心价值
    • rpm 的对比:自动下载、自动解析依赖树、一次性安装全部依赖
  • yum 常用命令
    • yum list 查询、yum install 安装、yum remove 卸载、yum update 升级
  • lrzsz 实战
    • rz 上传、sz 下载
    • 为什么命令行传输不可替代
  • 前置约束
    • yum 为在线安装,要求系统网络连通

yum 是什么

yum 全称 Yellow dog Updater, Modified,是 FedoraRed HatCentOS 中的前端软件包管理器

它与 rpm 的关系可以这样理解:yumrpm 的自动化外壳
#mermaid-svg-xNPlsVFw8dJO2kvE{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-xNPlsVFw8dJO2kvE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-xNPlsVFw8dJO2kvE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-xNPlsVFw8dJO2kvE .error-icon{fill:#552222;}#mermaid-svg-xNPlsVFw8dJO2kvE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-xNPlsVFw8dJO2kvE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-xNPlsVFw8dJO2kvE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-xNPlsVFw8dJO2kvE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-xNPlsVFw8dJO2kvE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-xNPlsVFw8dJO2kvE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-xNPlsVFw8dJO2kvE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-xNPlsVFw8dJO2kvE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-xNPlsVFw8dJO2kvE .marker.cross{stroke:#333333;}#mermaid-svg-xNPlsVFw8dJO2kvE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-xNPlsVFw8dJO2kvE p{margin:0;}#mermaid-svg-xNPlsVFw8dJO2kvE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-xNPlsVFw8dJO2kvE .cluster-label text{fill:#333;}#mermaid-svg-xNPlsVFw8dJO2kvE .cluster-label span{color:#333;}#mermaid-svg-xNPlsVFw8dJO2kvE .cluster-label span p{background-color:transparent;}#mermaid-svg-xNPlsVFw8dJO2kvE .label text,#mermaid-svg-xNPlsVFw8dJO2kvE span{fill:#333;color:#333;}#mermaid-svg-xNPlsVFw8dJO2kvE .node rect,#mermaid-svg-xNPlsVFw8dJO2kvE .node circle,#mermaid-svg-xNPlsVFw8dJO2kvE .node ellipse,#mermaid-svg-xNPlsVFw8dJO2kvE .node polygon,#mermaid-svg-xNPlsVFw8dJO2kvE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-xNPlsVFw8dJO2kvE .rough-node .label text,#mermaid-svg-xNPlsVFw8dJO2kvE .node .label text,#mermaid-svg-xNPlsVFw8dJO2kvE .image-shape .label,#mermaid-svg-xNPlsVFw8dJO2kvE .icon-shape .label{text-anchor:middle;}#mermaid-svg-xNPlsVFw8dJO2kvE .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-xNPlsVFw8dJO2kvE .rough-node .label,#mermaid-svg-xNPlsVFw8dJO2kvE .node .label,#mermaid-svg-xNPlsVFw8dJO2kvE .image-shape .label,#mermaid-svg-xNPlsVFw8dJO2kvE .icon-shape .label{text-align:center;}#mermaid-svg-xNPlsVFw8dJO2kvE .node.clickable{cursor:pointer;}#mermaid-svg-xNPlsVFw8dJO2kvE .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-xNPlsVFw8dJO2kvE .arrowheadPath{fill:#333333;}#mermaid-svg-xNPlsVFw8dJO2kvE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-xNPlsVFw8dJO2kvE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-xNPlsVFw8dJO2kvE .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xNPlsVFw8dJO2kvE .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-xNPlsVFw8dJO2kvE .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xNPlsVFw8dJO2kvE .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-xNPlsVFw8dJO2kvE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-xNPlsVFw8dJO2kvE .cluster text{fill:#333;}#mermaid-svg-xNPlsVFw8dJO2kvE .cluster span{color:#333;}#mermaid-svg-xNPlsVFw8dJO2kvE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-xNPlsVFw8dJO2kvE .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-xNPlsVFw8dJO2kvE rect.text{fill:none;stroke-width:0;}#mermaid-svg-xNPlsVFw8dJO2kvE .icon-shape,#mermaid-svg-xNPlsVFw8dJO2kvE .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-xNPlsVFw8dJO2kvE .icon-shape p,#mermaid-svg-xNPlsVFw8dJO2kvE .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-xNPlsVFw8dJO2kvE .icon-shape .label rect,#mermaid-svg-xNPlsVFw8dJO2kvE .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-xNPlsVFw8dJO2kvE .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-xNPlsVFw8dJO2kvE .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-xNPlsVFw8dJO2kvE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} rpm 方式
缺失
满足
rpm -ivh a.rpm
依赖是否存在
报错 xxx is needed
人工查找依赖包
人工下载后先装依赖
安装成功
yum 方式
yum install lrzsz
查询远端仓库元数据
自动解析完整依赖树
批量下载全部 rpm 包
按依赖顺序自动安装

对比维度 rpm yum
安装对象 本地 .rpm 文件 远端仓库中的软件包
网络要求 不需要 必须联网
依赖处理 不能自动解决 自动下载并安装全部依赖
安装顺序 需人工判断 自动计算
失败率 依赖缺失即失败
适用场景 离线环境、官方打包的多个包 日常软件安装

回顾 MySQL 的安装过程:需要人工按 commonlibsdevellibs-compatclientserver 的顺序逐个安装,中途还因缺少 net-tools 报错,必须额外执行一次 yum install net-tools 才能继续。而 yum 会把这些环节全部自动化------这就是它存在的全部意义

yum 常用命令

bash 复制代码
# 查询远端仓库中是否存在指定软件包
yum list lrzsz

# 在线安装,-y 参数用于自动确认,避免交互式阻塞
yum install -y lrzsz

# 卸载已安装的软件包
yum remove lrzsz

# 升级系统中已安装的软件及内核组件
yum update

# 查看已安装的软件包
yum list installed | grep lrzsz

# 清除缓存
yum clean all

# 重建缓存
yum makecache
命令 作用 说明
yum list <包名> 查询仓库中的可用包 输出中的 Available Packages 即为可安装版本
yum install -y <包名> 安装并自动解决依赖 -y 自动回答 yes
yum remove <包名> 卸载软件包 会同时提示将被移除的依赖
yum update 升级全部软件与内核 下载量大,需网络,生产环境慎用
yum search <关键字> 按关键字模糊搜索 忘记准确包名时使用
yum info <包名> 查看包的详细信息 版本、大小、来源仓库

安装过程解读

执行 yum install lrzsz 后的典型输出:

复制代码
Total download size: 181 k
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  Installing : lrzsz-0.12.20-36.el7.x86_64                      1/1
  Verifying  : lrzsz-0.12.20-36.el7.x86_64                      1/1

Installed:
  lrzsz.x86_64 0:0.12.20-36.el7.x86_64

Complete!

关键步骤:

  • Total download size:告知待下载体积
  • Is this ok [y/d/N]:交互确认,输入 y 继续(d 为仅下载不安装)
  • Running transaction:真正执行安装事务
  • Complete!:安装成功

lrzsz 文件传输

lrzsz 是 Linux 下用于文件上传与下载的工具套件,提供两个命令:

命令 方向 作用
rz Windows → Linux 弹出文件选择框,选中后上传到当前目录
sz <文件名> Linux → Windows 将指定文件下载到 Windows

使用方式

bash 复制代码
# 上传:执行后弹出文件选择对话框
rz

# 下载:将指定文件传回本地
sz helloworld.log

重要rz / sz 依赖终端软件的 Zmodem 协议支持。在 FinalShellXshellSecureCRT 中可直接工作;若终端不支持,命令会挂起,需用 Ctrl + C 终止。

为什么还需要 rz

一个常见的疑问是:SSH 客户端(如 FinalShell)已经自带图形化上传按钮,为什么还要装 lrzsz

场景 图形化上传 rz 命令
FinalShell 等带 GUI 的客户端 支持 支持
纯命令行终端、无 GUI 的 SSH 工具 不支持 支持
跳板机 / 堡垒机内的二次连接 通常不可用 支持
服务器本地控制台 不可用 支持

结论 :图形化上传是客户端能力,而 rz 是服务端能力。只要终端支持 Zmodem 协议,无论使用何种客户端都能完成传输,通用性更强。传输目标始终是当前工作目录 ,因此执行 rz 前应先 cd 到目标目录。

完整工作目录结构

txt 复制代码
/usr/local/
├── jdk1.8.0_171/                  # JDK(二进制发布包安装)
├── apache-tomcat-7.0.57/          # Tomcat(二进制发布包安装)
├── mysql/                         # MySQL rpm 安装包存放目录
│   ├── mysql-community-common-5.7.25-1.el7.x86_64.rpm
│   ├── mysql-community-libs-5.7.25-1.el7.x86_64.rpm
│   ├── mysql-community-devel-5.7.25-1.el7.x86_64.rpm
│   ├── mysql-community-libs-compat-5.7.25-1.el7.x86_64.rpm
│   ├── mysql-community-client-5.7.25-1.el7.x86_64.rpm
│   └── mysql-community-server-5.7.25-1.el7.x86_64.rpm
├── apache-maven-3.5.4/            # Maven(二进制发布包安装)
├── repo/                          # Maven 本地仓库
├── app/                           # 手工部署的 jar 包存放目录
├── sh/                            # Shell 脚本存放目录
│   └── bootStart.sh
└── helloworld/                    # git clone 下来的源码目录

对应的软件安装方式归类:

软件 安装方式 命令
JDK 二进制发布包 tar -zxvf ... -C /usr/local
Tomcat 二进制发布包 tar -zxvf ... -C /usr/local
Maven 二进制发布包 tar -zxvf ... -C /usr/local
MySQL rpm rpm -ivh ... ×6
lrzsz yum yum install -y lrzsz
git yum yum install -y git
net-tools yum yum install -y net-tools

完整可运行代码

基础环境一键初始化脚本

bash 复制代码
#!/bin/bash
# ============================================================
# 功能:通过 yum 批量安装常用基础工具
# 用法:chmod +x init_base_tools.sh && ./init_base_tools.sh
# 说明:本脚本要求服务器可访问外网 yum 仓库
# ============================================================

set -e

# 待安装的工具清单
# lrzsz      : rz/sz 文件上传下载
# net-tools  : 提供 netstat、ifconfig 等网络命令
# git        : 版本控制,Shell 自动部署时用于拉取代码
# vim        : 文本编辑器
# wget       : 命令行下载工具
# unzip      : zip 解压工具
TOOLS=("lrzsz" "net-tools" "git" "vim" "wget" "unzip")

echo "==================== 开始初始化基础工具 ===================="

for tool in "${TOOLS[@]}"; do
    echo "----------------------------------------------------------"
    echo "检查 ${tool} ..."

    # 已安装则跳过,未安装则查询仓库后安装
    if rpm -qa | grep -q "^${tool}"; then
        echo "${tool} 已安装,跳过"
    else
        echo "${tool} 未安装,查询仓库中的可用版本"
        yum list "${tool}"
        echo "开始安装 ${tool}"
        yum install -y "${tool}"
    fi
done

echo "==================== 安装结果校验 ===================="
for tool in "${TOOLS[@]}"; do
    printf "%-12s : %s\n" "${tool}" "$(rpm -qa | grep "^${tool}" || echo '未安装')"
done

echo "=========================================================="
echo "基础工具初始化完成"

文件上传位置校验脚本

bash 复制代码
#!/bin/bash
# ============================================================
# 功能:安全上传文件,执行前显式提示当前目录,避免传错位置
# 用法:chmod +x safe_upload.sh && ./safe_upload.sh
# ============================================================

TARGET_DIR="${1:-/usr/local/app}"

echo "准备上传文件"
echo "目标目录:${TARGET_DIR}"

# 目录不存在则创建
if [ ! -d "${TARGET_DIR}" ]; then
    echo "目标目录不存在,正在创建"
    mkdir -p "${TARGET_DIR}"
fi

# 必须切换到目标目录,rz 只会上传到当前工作目录
cd "${TARGET_DIR}"
echo "当前工作目录:$(pwd)"
echo "请在选择框中挑选要上传的文件..."

rz

echo "==================== 上传结果 ===================="
ls -lh "${TARGET_DIR}"

服务端下载校验 Java 程序

rz 传输的文件需要在 Java 侧消费时,可用下面的工具类校验文件完整性:

java 复制代码
package com.itheima.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * 计算文件的 MD5 值,用于校验 rz / sz 传输后文件是否完整。
 * 用法:java com.itheima.util.FileMd5Checker /usr/local/app/helloworld.jar
 */
public class FileMd5Checker {

    private static final char[] HEX = "0123456789abcdef".toCharArray();

    public static void main(String[] args) {
        if (args.length != 1) {
            System.err.println("用法:java FileMd5Checker <文件路径>");
            System.exit(1);
        }

        File file = new File(args[0]);
        if (!file.exists()) {
            System.err.println("文件不存在:" + file.getAbsolutePath());
            System.exit(1);
        }

        try {
            System.out.println("文件:" + file.getAbsolutePath());
            System.out.println("大小:" + file.length() + " 字节");
            System.out.println("MD5 :" + md5(file));
        } catch (Exception e) {
            System.err.println("计算 MD5 失败");
            e.printStackTrace();
        }
    }

    /**
     * 以 8KB 缓冲区分块读取并更新摘要,避免大文件一次性载入内存。
     *
     * @param file 目标文件
     * @return 32 位小写 MD5 字符串
     */
    public static String md5(File file) throws IOException, NoSuchAlgorithmException {
        MessageDigest digest = MessageDigest.getInstance("MD5");
        byte[] buffer = new byte[8192];
        try (FileInputStream in = new FileInputStream(file)) {
            int len;
            while ((len = in.read(buffer)) != -1) {
                digest.update(buffer, 0, len);
            }
        }
        return toHex(digest.digest());
    }

    /**
     * 字节数组转十六进制字符串。
     *
     * @param bytes 摘要字节数组
     * @return 十六进制表示
     */
    private static String toHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder(bytes.length * 2);
        for (byte b : bytes) {
            sb.append(HEX[(b >> 4) & 0x0f]).append(HEX[b & 0x0f]);
        }
        return sb.toString();
    }
}

API 速览

命令 作用 关键参数
yum list <包名> 查询仓库中可用软件包 不带包名则列出全部
yum install -y <包名> 在线安装并自动解决依赖 -y 自动确认
yum remove <包名> 卸载软件包 -y 自动确认
yum update 升级全部软件与内核 需网络,下载量大
yum search <关键字> 模糊搜索软件包 后接关键字
yum info <包名> 查看包详细信息 后接包名
yum clean all 清除本地缓存
yum makecache 重建本地缓存
rz 从本地上传文件到服务器当前目录 依赖终端 Zmodem 支持
sz <文件名> 从服务器下载文件到本地 后接文件名
`rpm -qa grep <包名>` 校验软件是否已安装

官方文档

总结

本文厘清了 yumrpm 的关系:yum 并非另一种包格式,而是架设在 rpm 之上的自动化前端,其全部价值在于把「查依赖 → 下载 → 排序 → 安装」这一串人工动作变成一条命令,代价是必须联网。以 lrzsz 为例演示了 yum listyum install 的标准流程,并说明了 rz / sz 相对于图形化上传按钮的不可替代性------前者是服务端能力,只要终端支持 Zmodem 协议即可工作,后者依赖具体客户端的 GUI 实现。

相关推荐
Java内核笔记1 小时前
Spring Boot 4 与 Spring AI 2.0 深度集成:ChatClient、Advisor 链与 MCP(源码级实战)
java·后端
可爱的小小小狼1 小时前
【无标题】
java·算法
用户3126874877201 小时前
Java SPI 到底怎么实现动态扩展的?从 ServiceLoader 到 Dubbo SPI 全链路拆解
java
新时代农民工~1 小时前
【双机高可用部署方案-前后端部署】
java·nginx·springboot
企业数字化笔记1 小时前
固定资产还有借用记录能报废吗?Java前置检查、停止折旧与SQL验收
java·开发语言·sql
飞虹地星海1 小时前
从零到一跑通苍穹外卖:一个大二学生的暑假项目复盘
java
她的男孩1 小时前
账号锁定配了"错 4 次锁 30 分钟",我连错 100 次一次没锁上:扒完 4091 行认证源码,找到 5 个坑
java·后端·架构
程序猿乐锅1 小时前
【黑马点评 | 第二篇】Redis 缓存更新策略与商铺缓存实现
java·网络·redis·spring·mybatis
livemetee1 小时前
MySQL联合唯一索引(code,deleted)与逻辑删除问题
java·数据库