14 软件包管理与安全下载

学习目标

识别发行版和包管理器,区分系统包与 Python/Node 项目依赖,只读查询已安装版本与来源,并建立“下载、校验、审阅、最低权限执行”的供应链安全流程。

先识别系统,不要猜命令

cat -- /etc/os-release
uname -srm
for tool in apt-get dnf5 dnf pacman apk; do
  if command -v -- "$tool" >/dev/null 2>&1; then
    printf 'package_manager=%s\n' "$tool"
  fi
done

常见映射:

发行版家族常见工具包数据库查询
Debian / UbuntuAPT、dpkgapt-cache、dpkg-query
Fedora / RHELDNF5、DNF、RPMdnf5/dnf、rpm
Archpacmanpacman -Q
Alpineapkapk info

容器镜像可能刻意移除包管理器;企业镜像还可能使用内部仓库。不要为了“命令一致”把另一个发行版的管理器装进系统。

系统包与项目依赖不是一层

  • 系统包管理器维护共享库、命令和系统集成。
  • Python 的 venv + pip、Node 的 lockfile 与项目目录维护应用依赖。
  • 一个名字相同的包在系统仓库和语言仓库中可能不是同一发布物。
  • 不要在系统 Python 中随意 sudo pip install;按 Python基础 创建虚拟环境。

只读查询示例

Debian/Ubuntu:

apt-cache policy curl
dpkg-query --show --showformat='${Package}\t${Version}\n' curl

Fedora/RHEL:

rpm -q --queryformat '%{NAME}\t%{VERSION}-%{RELEASE}\n' curl

Arch:

pacman -Qi curl

Alpine:

apk info -a curl

某个命令返回“未安装”不是课程失败;记录发行版、可用工具和退出码即可。仓库查询可能访问网络、刷新 metadata 或暴露内部源名称,真实环境先确认策略。

安装与升级是外部状态变更

sudo apt-get update
sudo apt-get install PACKAGE
sudo dnf5 install PACKAGE
sudo dnf install PACKAGE
sudo pacman -S PACKAGE
sudo apk add PACKAGE

这些只是语法入口,不在本课程直接执行。影响可能包括:

  • 修改系统文件、服务、共享库和依赖集合;
  • 触发维护脚本或服务重启;
  • 占用包管理器锁,与自动更新冲突;
  • 改变镜像可复现性或远程主机审计状态。

生产和共享主机应通过镜像构建、配置管理或经过批准的变更流程安装;先保存版本、来源、依赖、磁盘影响、测试和回滚方案。

为什么禁止盲目 curl | sh

curl URL | sh
curl URL | sudo sh

管道把网络响应直接交给 Shell:你难以先确认最终重定向内容、HTTP 失败页、脚本版本、签名和实际权限。TLS 只保护特定传输连接,不自动证明发布者、内容或未来行为可信。

更安全的通用流程:

  1. 从项目官方发布页获取固定版本 URL。
  2. 下载到新文件,不直接执行。
  3. 用独立官方渠道取得 checksum 或签名。
  4. 校验后人工阅读脚本或检查归档清单。
  5. 在最低权限、隔离环境中运行,并记录来源与版本。

语法示意:

curl --fail --location --show-error \
  --connect-timeout 5 --max-time 120 \
  --output tool-v1.2.3.tar.gz \
  https://OFFICIAL-HOST/releases/tool-v1.2.3.tar.gz
 
printf '%s  %s\n' EXPECTED_SHA256 tool-v1.2.3.tar.gz | sha256sum --check -
tar -tzf tool-v1.2.3.tar.gz

尖括号或大写占位值必须替换;本块是流程模板,不是可直接执行示例。--fail 只让部分 HTTP 错误成为失败,不证明内容安全;checksum 若从同一被攻破页面获取,也不是独立信任证据。

仓库与密钥边界

  • 不随意添加第三方仓库、导入签名密钥或关闭签名验证。
  • 不使用过时的全局信任做法来绕过仓库说明;按发行版当前官方文档配置最小作用域 keyring。
  • 代理、仓库 URL 和认证配置可能含内部信息或凭据,不完整粘贴到日志。
  • SBOM、锁文件、镜像 digest 与签名能增加可追踪性,但仍需要漏洞和来源审查。

动手练习:只读资产清单

在自有实验 Linux 环境中创建一份不含私人仓库 URL 的报告:

printf 'os_id='
. /etc/os-release
printf '%s\n' "$ID"
printf 'kernel=%s\n' "$(uname -r)"
for tool in apt-get dnf5 dnf pacman apk; do
  if command -v -- "$tool" >/dev/null 2>&1; then
    printf 'found=%s path=%s\n' "$tool" "$(command -v -- "$tool")"
  fi
done
command -v -- curl || true
command -v -- sha256sum || true

. /etc/os-release 会在当前 Shell 执行这个可信的系统文件;不要把 source/. 泛化到未知下载脚本。练习只识别能力,不安装、升级或下载任何内容。

掌握检查

  • 能根据 /etc/os-release 选择正确包管理器,而不是猜。
  • 能区分系统包、Python 虚拟环境依赖和容器镜像层。
  • 能说明安装/升级为何需要授权、测试和回滚。
  • 能把网络下载拆成固定版本、下载、独立校验、审阅和最低权限执行。
  • 不用关闭签名验证或 curl | sh 解决安装问题。

下一步:Shell 环境与变量。

参考资料

获取日期:2026-07-14。