【开源脚本】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 后安装。
相关推荐
吴声子夜歌3 小时前
Docker入门与实战——核心实现技术
运维·docker·容器
李纲明3 小时前
WordPress 安全加固基线:更新策略、文件权限、登录面收缩和备份验证(含回滚注意)
运维·安全·php·wordpress
2501_937767163 小时前
企业内部文件归集 + 服务器异地备份,轻量化方案选型对比
运维·服务器
0+1113 小时前
Linux --传输层协议 TCP
linux·网络·tcp/ip
志栋智能3 小时前
预算敏感型企业的自动化之路:IT运维低成本转型
运维·人工智能·自动化
盛世宏博智慧档案3 小时前
档案库房实现自动化的恒温恒湿消毒净化关键:恒湿消毒净化一体机
运维·自动化·一体机·恒湿机
wdfk_prog3 小时前
LWIP教程 15:IPv4 与 IPv6——从网络层工作原理到嵌入式工程取舍
运维·开发语言·网络·笔记·学习·智能路由器·ip
Novproxy_Z3 小时前
IPv4 与 IPv6 代理在跨境自动化场景下的选型与风险
运维·自动化·php
Sylvia-girl3 小时前
【二】:Linux基础指令
linux·运维·服务器