Ubuntu apt 命令介绍

发布时间: 更新时间: 总字数:2412 阅读时间:5m 作者: IP上海 分享 网址

Ubuntu/Debian apt 提供了丰富的命令,完成包的管理任务

介绍

  • APT(Advanced Package Tool)
  • apt-get 命令本身并不具有管理软件包功能,只是提供了一个软件包管理的命令行平台。
  • apt 命令不适合在脚本中运行,它会有颜色的显示、进度条显示等一些友好的交互界面,在脚本中不稳定,可能报错:WARNING: apt does not have a stable CLI interface. Use with caution in scripts.,此时,使用 apt-get 替代
  • 默认的缓存目录是
    • /var/cache/apt/archives/
    • /var/lib/apt/lists
  • 一般的 deb 包都在 /usr/share。自己下载的压缩包或者编译的包,一般放在/usr/local//opt 目录下

使用

apt-get 命令的一般语法格式为:

apt-get  subcommands  [ -d | -f | -m | -q | --purge | --reinstall | - b | - s | - y | - u | - h | -v ]  [pkg]

更新或升级

apt-get update          # 更新源
apt-get upgrade         # 更新所有已安装的包
apt-get dist-upgrade    # 发行版升级(如,从10.10到11.04)

安装或重装类

apt-get install pkg                # 安装pkg软件包,多个软件包用空格隔开
apt-get install --reinstall pkg    # 重新安装软件包pkg
apt-get install -f pkg             # 修复安装(破损的依赖关系)软件包pkg

卸载类

apt-get check                  # 检查是否有损坏的依赖
apt-get remove package – - purge
apt-get remove pkg             # 删除软件包pkg(不包括配置文件)
apt-get purge pkg              # 删除软件包pkg(包括配置文件)

下载清除类

apt-get clean                  # 清除缓存(/var/cache/apt/archives/{,partial}下)中所有已下载的包
apt-get autoclean              # 类似于clean,但清除的是缓存中过期的包(即已不能下载或者是无用的包)
apt-get autoremove             # 删除因安装软件自动安装的依赖,而现在不需要的依赖包

源码编译类

apt-get source pkg             # 下载pkg包的源代码到当前目录
apt-get download pkg           # 下载pkg包的二进制包到当前目录
apt-get source -d pkg          # 下载完源码包后,编译
apt-get build-dep  pkg         # 构建pkg源码包的编译环境

查询类

apt-cache 提供了搜索功能

apt-cache stats                 # 显示系统软件包的统计信息
apt-cache search pkg            # 使用关键字pkg搜索软件包
apt-cache show pkg_name         # 显示软件包pkg_name的详细信息,如说明、大小、版本等
apt-cache depends pkg           # 查看pkg所依赖的软件包
apt-cache rdepends pkg          # 查看pkg被那些软件包所依赖

其中:

  1. 普通用户需要可以添加 sudo 申请管理权限
  2. 在 MAN 命令中需要退出命令帮助请按 q

aptitude

解决安装包冲突问题

aptitudeaptapt-get 功能一样,都是用来为 Ubuntu 安装软件包,它可以 自动解决安装时出现的各种依赖问题,安装命令如下:

apt install aptitude

缓存包

sudo aptitude --download-only install <package-name>
# 或
apt-get -d install <package-name>

缓存包的位置:/var/cache/apt/archives,离线安装命令:dpkg -i *.deb

apt-key

apt-key 用来管理 Ubuntu/Debian Linux 系统中的软件包密钥,保证 deb 的可信性。

$ apt-key
Usage: apt-key [--keyring file] [command] [arguments]

Manage apt's list of trusted keys

  apt-key add <file>          - add the key contained in <file> ('-' for stdin)
  apt-key del <keyid>         - remove the key <keyid>
  apt-key export <keyid>      - output the key <keyid>
  apt-key exportall           - output all trusted keys
  apt-key update              - update keys using the keyring package
  apt-key net-update          - update keys using the network
  apt-key list                - list keys
  apt-key finger              - list fingerprints
  apt-key adv                 - pass advanced options to gpg (download key)

If no specific keyring file is given the command applies to all keyring files.

说明:

  • apt-key list 列出已保存的 key

  • apt-key add <keyid> 把 key 添加到本地信任列表

    • 对于更现代的 Debian/Ubuntu 版本,推荐将公钥放置到 /usr/share/keyrings/ 目录下,并在 APT 源列表中使用 signed-by 选项:
    # 下载公钥并dearmor
    curl -fsSL https://example.com/my-public-key.asc | sudo gpg --dearmor -o /usr/share/keyrings/my-public-key.gpg
    
    # 然后在你的 APT 源文件 (例如 /etc/apt/sources.list.d/myrepo.list) 中添加或修改类似以下行:
    deb [signed-by=/usr/share/keyrings/my-public-key.gpg] https://example.com/myrepo stable main
    
  • apt-key export <keyid> - 通过 keyid 导出 key

  • apt-key del <keyid> 从本地删除 key

  • apt-key net-update 通过网络更新 key

  • apt-key update 删除本地过期的 key

  • apt-key finger显示被信任密钥的列表

apt-mark

  • apt-mark 对软件包进行设置(手动/自动 )安装标记
    • auto 标记指定软件包为自动安装
    • manual 标记指定软件包为手动安装
    • minimize-manual Mark all dependencies of meta packages as automatically installed
    • hold 标记指定软件包为保留(held back),阻止软件自动更新
    • unhold 取消指定软件包的保留(held back)标记,解除阻止自动更新
    • showauto 列出所有自动安装的软件包
    • showmanual 列出所有手动安装的软件包
    • showhold 列出设为保留的软件包
# 禁止自动更新
$ apt-mark hold nano
nano set on hold.

# 查看禁止的软件
$ apt-mark showhold
hold

# 取消禁止自动更新
$ apt-mark unhold nano
Canceled hold on nano.

若更新 hold 的软件,会提示 xxx was already set on hold

apt 软件仓库

sources list 格式

  • /etc/apt/sources.list 示例
# ubuntu:22.04
deb http://archive.ubuntu.com/ubuntu/ jammy main restricted

# 格式
# 二进制包
deb <uri> <distribution> [component1] [component2] […]
# 源码包
deb-src <uri> <distribution> [component1] [component2] […]
  • 以发行版 componentjammy 版本为例,官方仓库地址
    • 包含如下目录
      • main/ Canonical 支持的自由开源软件
      • multiverse/ 受版权或法律问题限制的软件
      • restricted/ 设备的专有驱动程序
      • universe/ 社区维护的自由开源软件
    • 包含如下文件
      • Contents-amd64.gz
      • Contents-i386.gz
      • InRelease
      • Release 索引文件
      • Release.gpg
    • 标准的 debian 组件包括:maincontribnon-freenon-us
  • apt 流程,从 /ubuntu/dists/jammy/Release 文件获取 Contents-amd64.gz,然后获取需要包的地址,下载,安装

timeout 配置

  • /etc/apt/apt.conf.d/99timeouts 参考
Acquire::ftp::Timeout "240";
Acquire::http::timeout "240";
Acquire::https::timeout "240";

deb 包 gpg 签名示例

也可以使用 debsign 签名,但通常签名 .deb 包通常不是直接签名 .deb 文件本身,而是通过创建 Release 文件和 Packages 文件的 GPG 签名来实现的,示例如下:

gpg --full-generate-key
  • 创建一个简单的 .deb 软件包
# 创建软件包目录结构
mkdir -p my-example-app/DEBIAN
mkdir -p my-example-app/usr/local/bin

# 创建一个简单的可执行脚本
echo '#!/bin/bash' > my-example-app/usr/local/bin/my-example-script
echo 'echo "Hello from my example app!"' >> my-example-app/usr/local/bin/my-example-script
chmod +x my-example-app/usr/local/bin/my-example-script

# 创建 control 文件
cat <<EOF > my-example-app/DEBIAN/control
Package: my-example-app
Version: 1.0.0
Section: custom
Priority: optional
Architecture: amd64
Maintainer: Your Name <your.email@example.com>
Description: A simple example application.
EOF

# 构建 .deb 包
dpkg-deb --build my-example-app my-example-app_1.0.0_amd64.deb
  • 为 APT 仓库准备和签名 Release 文件
  • 创建一个简单的本地 APT 仓库
mkdir -p ~/my-apt-repo/dists/stable/main/binary-amd64
mkdir -p ~/my-apt-repo/pool/main

# 将你的 .deb 包移动到仓库的 pool 目录
mv my-example-app_1.0.0_amd64.deb ~/my-apt-repo/pool/main/

# 生成 Packages 文件
cd ~/my-apt-repo
dpkg-scanpackages pool/main /dev/null | gzip -9c > dists/stable/main/binary-amd64/Packages.gz
dpkg-scanpackages pool/main /dev/null > dists/stable/main/binary-amd64/Packages
  • 生成 Release 文件,Release 文件包含仓库中所有软件包的哈希值和大小信息
# 注意:路径需要正确指向你的 Packages 和 Packages.gz 文件
apt install apt-utils
cd dists/stable && apt-ftparchive release . > Release
  • 签名 Release 文件,生成 Release.gpg 和 InRelease 文件,参数说明:
    • --armor 选项表示使用 ASCII Armored 格式输出(文本格式)
    • --detach-sign 表示生成一个单独的签名文件(.gpg 后缀)
    • --clearsign 则将签名嵌入到原始文件内部(生成 InRelease)
# 签名 Release 文件,生成 Release.gpg
gpg --yes --output dists/stable/Release.gpg --armor --detach-sign dists/stable/Release

# 生成 InRelease 文件(推荐,因为它包含了签名和 Release 数据在一个文件中)
gpg --yes --output dists/stable/InRelease --armor --clearsign dists/stable/Release
  • 发布公钥
gpg --armor --export "Your Name <your.email@example.com>" > my-repo-key.asc
  • 使用时,添加公钥
sudo apt-key add my-repo-key.asc
# 或者,对于更现代的 Debian/Ubuntu 版本,更推荐的方式:
# curl -fsSL https://your-repo.com/my-repo-key.asc | sudo gpg --dearmor -o /usr/share/keyrings/my-repo-keyring.gpg

# 或
mv xxx.gpg /etc/apt/trusted.gpg.d/
  • /etc/apt/sources.list.d/my-repo.list
# 如果你使用了 InRelease 或 Release.gpg
deb [arch=amd64] file:///home/user/my-apt-repo stable main

# 如果你使用了 signed-by 选项(推荐)
# deb [arch=amd64 signed-by=/usr/share/keyrings/my-repo-keyring.gpg] file:///home/user/my-apt-repo stable main

FaQ

Updates for this repository will not be applied.

apt update 时,报如上错误,该问题一般由于系统时间不同步导致,使用如下命令同步:

hwclock --hctosys

apt skip ssl cert verify

cat << EOF > /etc/apt/apt.conf.d/80ssl-exceptions
// Do not verify peer certificate
Acquire::https::Verify-Peer "false";
// Do not verify that certificate name matches server name
Acquire::https::Verify-Host "false";
EOF

apt -o "Acquire::https::Verify-Peer=false" update

proxy 配置

  • 方式一:修改 /etc/apt/apt.conf 配置
# Acquire::http::Proxy "http://[username:password]@proxy-host:proxy-port/";
Acquire::http::Proxy "http://192.168.0.10:1080/";

或执行命令时临时指定 proxy

# apt install xxx -o -o Acquire::http::proxy="http://[username:password]@proxy-host:proxy-port/"
sudo apt install vim -o Acquire::http::proxy="http://192.168.0.10:1080/"
  • 方式二:修改 /etc/apt/apt.conf.d/proxy.conf
Acquire {
  HTTP::proxy "http://127.0.0.1:8889";
  HTTPS::proxy "http://127.0.0.1:8889";
}
  • 方式三:/etc/apt/auth.conf 参考
machine example.org
login apt
password debian

或 sources.list 中调整为

deb http://apt:debian@example.org/debian buster main

disable signed

apt-get update --allow-unauthenticated
sudo apt-get install <package-name> --allow-unauthenticated
  • 或,/etc/apt/apt.conf.d/99insecure
APT::Get::AllowUnauthenticated "true";
Acquire::AllowInsecureRepositories "true";
Acquire::AllowDowngradeToInsecureRepositories "true";
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数