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,是 Fedora、Red Hat、CentOS 中的前端软件包管理器。
它与 rpm 的关系可以这样理解:yum 是 rpm 的自动化外壳。
#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 的安装过程:需要人工按 common → libs → devel → libs-compat → client → server 的顺序逐个安装,中途还因缺少 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协议支持。在FinalShell、Xshell、SecureCRT中可直接工作;若终端不支持,命令会挂起,需用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 <包名>` | 校验软件是否已安装 |
官方文档
- yum 官方主页:http://yum.baseurl.org/
- CentOS yum 使用指南:https://docs.centos.org/en-US/centos/install-guide/yum/
- lrzsz 项目主页:https://ohse.de/uwe/software/lrzsz.html
- RPM 官方文档:http://rpm.org/documentation.html
总结
本文厘清了 yum 与 rpm 的关系:yum 并非另一种包格式,而是架设在 rpm 之上的自动化前端,其全部价值在于把「查依赖 → 下载 → 排序 → 安装」这一串人工动作变成一条命令,代价是必须联网。以 lrzsz 为例演示了 yum list 与 yum install 的标准流程,并说明了 rz / sz 相对于图形化上传按钮的不可替代性------前者是服务端能力,只要终端支持 Zmodem 协议即可工作,后者依赖具体客户端的 GUI 实现。