需求
需要在Ubuntu环境,下载任意Ubuntu发行版的任意软件,复制到离线环境部署使用。
源代码
https://gitcode.com/zhudev2026/download-package-ubuntu
说明
Ubuntu 离线软件包下载工具。用于下载指定软件包及其依赖的 .deb 文件,便于在无法联网的目标机上离线安装。
- 仅支持在 Ubuntu 环境 运行(脚本校验
ID=ubuntu,仅为使用 apt 工具;运行机自身版本不限) --os指定的是下载的软件包所适配的目标系统版本,与运行机版本无关- 支持 Ubuntu 全部官方发布版本 (在 Ubuntu 官方源可查到的版本均可,无最低版本限制 ):代号如
jammy/noble/resolute/bionic/focal等,或版本号如22/22.04/20.04/26.10 - 官方源不可达时自动回退:阿里云镜像 -> Ubuntu old-releases(兼容已 EOL 的旧版本如 18.04 / 20.04)
文件说明
dp.sh:当前版本(脚本名已缩短),单包 / 批量下载统一入口(推荐)packages.list:批量下载的软件包清单示例(每行一个包,#开头为注释)
使用前提
-
脚本以
dp.sh形式直接使用(无需安装为系统命令)。首次使用前请先赋予执行权限:bashchmod +x dp.sh -
赋权后即可直接运行,例如
./dp.sh -n iptables;若不想赋权,也可始终用bash dp.sh ...方式运行。
环境要求
- 运行机需为 Ubuntu(脚本会校验
ID=ubuntu),且自身能访问目标版本的 apt 源 - 需具备
apt-get/apt-cache/dpkg/tar/mktemp等基础工具(标准 Ubuntu 均已自带) - 需要 root 权限(或当前用户可
sudo);非 root 时脚本自动尝试sudo - 网络:脚本优先复用运行机现有镜像(目标版本与运行机相同时),否则使用 Ubuntu 官方源,官方不可达时自动切换阿里云镜像,再不行回退 old-releases
参数与用法
./dp.sh [选项]
--os <版本> 指定下载软件包所适配的目标 Ubuntu 版本(≠运行机版本限制)。
支持数字版本或代号: 22 / 22.04 / jammy / 20.04 / bionic / 26.10 / stonking 等
不指定则使用当前系统版本(运行机版本不限)
-n, --name <包> 下载并打包单个软件包(与 -f 互斥)
-f, --file <文件> 从清单文件批量下载(与 -n 互斥)
--full 下载完整依赖闭包(含所有间接依赖);默认仅直接依赖 + PreDepends
-h, --help 显示帮助
示例(每种组合各一例):
# 1) 单包 · 当前系统版本
./dp.sh -n iptables
# 2) 单包 · 指定版本(数字)
./dp.sh --os 22 -n iptables
# 3) 单包 · 指定版本(代号)
./dp.sh --os jammy -n iptables
# 4) 单包 · 完整依赖闭包
./dp.sh --full -n iptables
# 5) 单包 · 指定版本 + 完整依赖
./dp.sh --os 20.04 --full -n iptables
# 6) 批量 · 清单文件(当前系统版本)
./dp.sh -f packages.list
# 7) 批量 · 清单 + 指定版本
./dp.sh --os 22 -f packages.list
# 8) 批量 · 清单 + 指定版本 + 完整依赖
./dp.sh --os 22 --full -f packages.list
# 历史/旧版本(官方源不可达时自动回退 old-releases)
./dp.sh --os 18.04 -n vim # Ubuntu 18.04 (bionic)
./dp.sh --os bionic -n vim # 等价写法(代号)
输出布局:
- 单包:在当前目录新建
./<包名>/存放.deb,并打包为<包名>_<版本代号>.tar.gz - 批量:在当前目录新建
cache/<包名>/存放各包.deb,各自打包为cache/<包名>_<版本代号>.tar.gz,均位于cache/下
退出码:
| 退出码 | 含义 |
|---|---|
| 0 | 成功 |
| 1 | 用法或参数错误(-n/-f 互斥冲突、非法包名、--os 无法识别的数字版本、缺失必需参数) |
| 2 | 部分包或其依赖下载失败 |
| 3 | 源配置或 apt-get update 失败(官方源、阿里云、old-releases 均不可达) |
清单文件格式(packages.list)
# 示例软件包清单文件
# 以 # 开头的行为注释,会被自动忽略
# 每行一个软件包名称
# 文本编辑器
vim
nano
# 系统工具
curl
wget
htop
# 网络工具
net-tools
iputils-ping
设计要点
- 源隔离 :所有 apt 操作写入
mktemp私有临时目录,通过-o Dir::Etc::SourceList / Dir::State / Dir::Cache等参数隔离,不修改/etc/apt/sources.list、/etc/apt/sources.list.d/、/var/lib/apt/lists;脚本退出时自动清理临时目录。 - 版本映射 :
--os支持版本号(如22/24.04/20.04/26.10)或代号(如jammy/bionic);代号一律透传,无最低版本门槛,只要是 Ubuntu 官方发布版本即可。 - 多级回退 :官方源(
archive.ubuntu.com/ports.ubuntu.com) → 阿里云镜像 →old-releases.ubuntu.com(官方历史归档,用于已 EOL 版本),任一可用即采用。 - 旧版本 GPG 兼容 :当目标版本归档签名密钥不在本机密钥环时(如 bionic / trusty),自动降级为允许未认证仓库以获取索引;noble / jammy / focal 等现代版本仍走正常 GPG 校验不受影响。
--os仅指下载软件包适配的目标版本,对运行机自身版本无任何限制。 - 架构适配 :
amd64/i386使用archive.ubuntu.com,其余架构自动使用ports.ubuntu.com;阿里云与 old-releases 镜像同理。 - 依赖策略 :默认仅下载直接依赖 + PreDepends;
--full使用空dpkgstatus 技巧,按"目标机全新安装"视角下载完整闭包。 - 离线可用 :保留
.deb目录,可直接dpkg -i <包名>/*.deb,或在目标机解压 tar 后安装。