文件下载-ubuntu操作系统下载指定文件

需求

在任意联网的ubuntu操作系统,下载适配当前操作系统发行版的指定的软件包及其依赖包,提供给离线的同发行版系统使用。

限制条件

  • 需在联网环境操作进行软件下载。
  • 下载软件的操作系统需与需要软件包的离线环境操作系统主版本一致。
  • 若在不同发行版下载软件,应替换为离线环境操作系统适配的指定软件源,存在故障风险。

处理方法

编写脚本

bash 复制代码
#!/bin/bash

# 初始化变量
package_name=""
download_dir=""
dist=""

# 显示帮助信息
usage() {
  echo "使用方法: $0 [选项]"
  echo "选项:"
  echo "  -n, --name <软件包名称>   指定要下载的软件包名称(必需)"
  echo "  -d, --dir <下载目录>      指定下载目录(可选,默认: /tmp/<软件包名称>/)"
  echo "  -h, --help                显示此帮助信息"
  exit 1
}

# 获取当前系统的发行版版本代号
get_distribution() {
  # 检查是否存在os-release文件
  if [ -f /etc/os-release ]; then
    . /etc/os-release
    # 返回版本代号,如果不存在则返回发行版名称
    if [ -n "$VERSION_CODENAME" ]; then
      echo "$VERSION_CODENAME"
    else
      echo "$ID$VERSION_ID" | tr '[:upper:]' '[:lower:]'
    fi
  else
    #  fallback方案
    echo "$(lsb_release -cs 2>/dev/null || echo "unknown")"
  fi
}

# 解析命令行参数(支持长选项)
OPTIONS=$(getopt -o n:d:h --long name:,dir:,help -n "$0" -- "$@")

if [ $? -ne 0 ]; then
  echo "解析参数错误,请使用 -h 查看帮助" >&2
  exit 1
fi

eval set -- "$OPTIONS"

while true; do
  case "$1" in
    -n|--name)
      package_name="$2"
      shift 2
      ;;
    -d|--dir)
      download_dir="$2"
      shift 2
      ;;
    -h|--help)
      usage
      ;;
    --)
      shift
      break
      ;;
    *)
      echo "内部错误" >&2
      exit 1
      ;;
  esac
done

# 检查必需参数是否完整
if [ -z "$package_name" ]; then
  echo "错误:软件包名称为必需参数" >&2
  usage
fi

# 设置默认下载目录
if [ -z "$download_dir" ]; then
  download_dir="/tmp/$package_name/"
  echo "未指定下载目录,将使用默认目录: $download_dir"
fi

# 获取发行版信息
dist=$(get_distribution)
if [ -z "$dist" ] || [ "$dist" = "unknown" ]; then
  echo "警告:无法识别操作系统发行版,将使用'unknown'作为发行版标识" >&2
  dist="unknown"
fi

# 创建下载目录(如果不存在)
mkdir -p "$download_dir"
if [ $? -ne 0 ]; then
  echo "无法创建目录 $download_dir" >&2
  exit 1
fi

# 兼容处理:放宽目录权限
sudo chmod -R 777 "$download_dir"
if [ $? -ne 0 ]; then
  echo "无法设置目录 $download_dir 权限" >&2
  exit 1
fi

# 切换到下载目录
cd "$download_dir" || {
  echo "无法进入目录 $download_dir" >&2
  exit 1
}

# 更新包索引
echo "正在更新包索引..."
sudo apt update > /dev/null 2>&1
if [ $? -ne 0 ]; then
  echo "更新包索引失败" >&2
  exit 1
fi

# 获取依赖包列表
echo "正在解析 $package_name 的依赖关系..."
dependencies=$(apt-cache depends --recurse --no-recommends --no-suggests \
  --no-conflicts --no-breaks --no-replaces --no-enhances --no-pre-depends \
  "$package_name" | grep "^\w" | sort -u)

if [ -z "$dependencies" ]; then
  echo "无法解析 $package_name 的依赖关系" >&2
  exit 1
fi

# 下载软件包及其所有依赖
echo "正在下载 $package_name 及其依赖包到 $download_dir..."
sudo apt download $dependencies

# 检查下载是否成功
if [ $? -ne 0 ]; then
  echo "下载过程中出现错误" >&2
  exit 1
fi

# 打包下载的软件包
archive_name="${package_name}_${dist}.tar.gz"
echo "正在将下载的软件包打包为: $archive_name"
tar -zcvf "$archive_name" *.deb > /dev/null 2>&1

# 检查打包是否成功
if [ $? -eq 0 ] && [ -f "$archive_name" ]; then
  echo "打包完成: $download_dir$archive_name"
  # 可选:删除原始deb文件,只保留压缩包
  # rm -f *.deb
else
  echo "打包过程中出现错误" >&2
  exit 1
fi

echo "操作完成。最终包已保存到: $download_dir$archive_name"

执行脚本,即可下载特定软件。

参考https://github.com/zhuyifeiRuichuang/k8s-script/blob/main/ubuntu/download_packages.sh

相关推荐
qq_2975746711 分钟前
Linux 服务器 Java 开发环境搭建保姆级教程
java·linux·服务器
70asunflower36 分钟前
Emulation,Simulation,Virtualization,Imitation 的区别?
linux·docker
神梦流1 小时前
GE 引擎的内存优化终局:静态生命周期分析指导下的内存分配与复用策略
linux·运维·服务器
凡人叶枫1 小时前
C++中输入、输出和文件操作详解(Linux实战版)| 从基础到项目落地,避坑指南
linux·服务器·c语言·开发语言·c++
wdfk_prog1 小时前
[Linux]学习笔记系列 -- [drivers][input]serio
linux·笔记·学习
xuhe22 小时前
[全流程详细教程]Docker部署ClawBot, 使用GLM4.7, 接入TG Bot实现私人助理. 解决Docker Openclaw Permission Denied问题
linux·docker·ai·github·tldr
Lsir10110_2 小时前
【Linux】进程信号(下半)
linux·运维·服务器
酉鬼女又兒2 小时前
零基础入门Linux指南:每天一个Linux命令_pwd
linux·运维·服务器
云飞云共享云桌面2 小时前
高性能图形工作站的资源如何共享给10个SolidWorks研发设计用
linux·运维·服务器·前端·网络·数据库·人工智能
zl_dfq2 小时前
Linux 之 【多线程】(pthread_xxx、轻量级进程、原生线程库、线程ID、__thread、线程栈、线程与信号、线程与程序替换)
linux