【开源脚本】Ubuntu环境下载任意软件

需求

需要在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 形式直接使用(无需安装为系统命令)。首次使用前请先赋予执行权限:

    bash 复制代码
    chmod +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 使用空 dpkg status 技巧,按"目标机全新安装"视角下载完整闭包。
  • 离线可用 :保留 .deb 目录,可直接 dpkg -i <包名>/*.deb,或在目标机解压 tar 后安装。
相关推荐
A7bert7771 分钟前
【MobileSAM部署至RK3588】环境适配→转换RKNN→开发板部署
c++·人工智能·深度学习·目标检测·ubuntu
Decay__12 分钟前
17_MySQL 监控体系构建 —— mysqld_exporter + Prometheus + Grafana 全栈实战
运维·数据库·sql·mysql·架构
ITKEY_22 分钟前
emacs 文件管理Dired, the Directory Editor
linux·编辑器·emacs
天远数科22 分钟前
零信任架构实战:基于天远全能家政风险报告构建自动化即时到家保洁与短工抢单安全核验网关
运维·人工智能·架构·自动化
源图客26 分钟前
解决CentOS操作系统网络异常问题
linux·运维·centos
分布式存储与RustFS39 分钟前
K8s 集群备份落到自建对象存储:Velero 接 RustFS 配置指南
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
镜子AI10 小时前
镜子AI 技术复盘:三条自动化链路上的“停止条件“设计
运维·人工智能·自动化
tianyuanwo10 小时前
NetBox 数据库详解:当“关系型数据库”被装进一个网络运维的领域模型里
运维·数据库·netbox
HideF10 小时前
Linux sudo
linux
FlightYe11 小时前
视界原理之3D视频(四):裸眼、眼镜和头显
android·linux·c++·3d·ffmpeg·音视频