apt 是一个功能强大的命令行工具,用于管理Debian/Ubuntu系统的软件包。它提供了比低级的dpkg更友好的用户接口,能够自动处理软件包的依赖关系、更新软件包列表、升级系统等操作。apt最初是为Debian设计的,现在已成为Ubuntu和许多其他基于Debian的Linux发行版的标准包管理工具。
apt(版本>=1.0)是一个较新的工具,设计用于取代apt-get、apt-cache等工具,提供更简洁易用的接口:
| 特性 | apt | apt-get |
|---|---|---|
| 命令简洁性 | 命令更简洁易记 | 命令较长 |
| 进度显示 | 彩色进度条 | 简单文本进度 |
| 功能集成 | 集成apt-get和apt-cache功能 | 仅包管理功能 |
| 搜索命令 | apt search |
apt-cache search |
| 显示信息 | apt show |
apt-cache show |
| 版本要求 | Ubuntu 16.04+/Debian 8+ | 所有版本 |
apt [选项] 命令 [包名...]
| 命令 | 说明 | 示例 |
|---|---|---|
update |
更新可用软件包列表 | apt update |
upgrade |
升级所有可升级的软件包 | apt upgrade |
full-upgrade |
升级并处理依赖关系(可能删除包) | apt full-upgrade |
install |
安装软件包 | apt install nginx |
remove |
删除软件包(保留配置文件) | apt remove nginx |
purge |
删除软件包(同时删除配置文件) | apt purge nginx |
autoremove |
删除自动安装且不再需要的包 | apt autoremove |
search |
搜索软件包 | apt search nginx |
show |
显示软件包详细信息 | apt show nginx |
list |
列出软件包 | apt list --installed |
edit-sources |
编辑软件源列表 | apt edit-sources |
clean |
清理下载的包文件 | apt clean |
autoclean |
清理旧的包文件 | apt autoclean |
| 选项 | 说明 |
|---|---|
-y 或 --yes |
自动回答"yes"(非交互式使用) |
--no-install-recommends |
不安装推荐的软件包 |
--install-suggests |
安装建议的软件包 |
-q 或 --quiet |
静默模式,减少输出 |
-v 或 --verbose |
详细输出 |
-d 或 --download-only |
仅下载,不安装 |
--reinstall |
重新安装软件包 |
-s 或 --simulate |
模拟执行,不实际修改系统 |
--dry-run |
同--simulate |
-V 或 --version |
显示版本信息 |
-h 或 --help |
显示帮助信息 |
# 更新软件包列表(从软件源获取最新信息)
sudo apt update
# 升级所有可升级的软件包(不改变依赖关系)
sudo apt upgrade
# 完全升级(可能改变依赖关系)
sudo apt full-upgrade
# 组合命令:更新并升级
sudo apt update && sudo apt upgrade -y
# 安装单个软件包
sudo apt install nginx
# 安装多个软件包
sudo apt install nginx mysql-server php-fpm
# 安装指定版本
sudo apt install nginx=1.18.0-0ubuntu1
# 重新安装软件包
sudo apt install --reinstall nginx
# 仅下载不安装
sudo apt install -d nginx
# 不安装推荐的包
sudo apt install --no-install-recommends nginx
# 删除软件包(保留配置文件)
sudo apt remove nginx
# 完全删除软件包(包括配置文件)
sudo apt purge nginx
# 删除多个软件包
sudo apt remove nginx mysql-server
# 删除自动安装的不需要的包
sudo apt autoremove
# 删除并清理配置文件
sudo apt purge nginx && sudo apt autoremove
# 搜索软件包
apt search nginx
# 显示软件包详细信息
apt show nginx
# 列出所有已安装的软件包
apt list --installed
# 列出所有可升级的软件包
apt list --upgradable
# 列出所有可用软件包
apt list --all-versions
# 查找包含特定文件的软件包
apt-file search /usr/bin/nginx
# 需要先安装apt-file: sudo apt install apt-file
# 清理下载的包文件(/var/cache/apt/archives/)
sudo apt clean
# 清理旧的包文件(只保留最新版本)
sudo apt autoclean
# 清理不需要的依赖
sudo apt autoremove
# 清理并自动删除
sudo apt autoclean && sudo apt autoremove
# 编辑软件源列表
sudo apt edit-sources
# 手动编辑软件源
sudo nano /etc/apt/sources.list
# 添加PPA(Personal Package Archive)
sudo add-apt-repository ppa:ondrej/php
sudo apt update
# 移除PPA
sudo add-apt-repository --remove ppa:ondrej/php
sudo apt update
# 查看软件包的依赖关系
apt depends nginx
# 查看哪些包依赖此包
apt rdepends nginx
# 查看软件包提供的文件
apt-file list nginx
# 查看未满足的依赖
apt check
# 模拟安装(不实际执行)
sudo apt install -s nginx
# 显示变更摘要
sudo apt install nginx --assume-no | grep -E "installed|upgraded|removed"
# 保持软件包版本(防止自动升级)
sudo apt-mark hold nginx
# 取消保持
sudo apt-mark unhold nginx
# 显示被保持的软件包
apt-mark showhold
# 软件源列表
/etc/apt/sources.list
/etc/apt/sources.list.d/*.list
# apt配置
/etc/apt/apt.conf
/etc/apt/apt.conf.d/*
# 软件包优先级
/etc/apt/preferences
/etc/apt/preferences.d/*
# 软件源密钥
/etc/apt/trusted.gpg
/etc/apt/trusted.gpg.d/*
# 缓存目录
/var/cache/apt/archives/ # 下载的包文件
/var/lib/apt/lists/ # 软件包列表缓存
# 基本格式
deb [arch=架构] 仓库地址 发行版 组件...
# 示例 - Ubuntu官方源
deb http://archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ focal main restricted universe multiverse
# 示例 - 安全更新
deb http://security.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
# 示例 - 国内镜像源(阿里云)
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
#!/bin/bash
# 系统更新和维护脚本
LOG_FILE="/var/log/system_update.log"
echo "=== 系统更新开始: $(date) ===" | tee -a "$LOG_FILE"
# 更新软件包列表
echo "1. 更新软件包列表..." | tee -a "$LOG_FILE"
sudo apt update 2>&1 | tee -a "$LOG_FILE"
# 升级软件包
echo "2. 升级软件包..." | tee -a "$LOG_FILE"
sudo apt upgrade -y 2>&1 | tee -a "$LOG_FILE"
# 完全升级
echo "3. 完全升级..." | tee -a "$LOG_FILE"
sudo apt full-upgrade -y 2>&1 | tee -a "$LOG_FILE"
# 清理
echo "4. 清理系统..." | tee -a "$LOG_FILE"
sudo apt autoremove -y 2>&1 | tee -a "$LOG_FILE"
sudo apt autoclean 2>&1 | tee -a "$LOG_FILE"
echo "=== 系统更新完成: $(date) ===" | tee -a "$LOG_FILE"
#!/bin/bash
# 批量安装开发工具
DEV_TOOLS=(
"build-essential"
"git"
"curl"
"wget"
"vim"
"htop"
"net-tools"
"software-properties-common"
)
echo "安装开发工具..."
for tool in "${DEV_TOOLS[@]}"; do
echo "正在安装: $tool"
sudo apt install -y "$tool"
done
#!/bin/bash
# 监控可升级的软件包
UPGRADE_LOG="/var/log/package_upgrades.log"
MAX_UPGRADES=50
# 检查可升级的包数量
upgrade_count=$(apt list --upgradable 2>/dev/null | grep -c "upgradable")
if [ "$upgrade_count" -gt 0 ]; then
echo "$(date): 发现 $upgrade_count 个可升级的包" >> "$UPGRADE_LOG"
if [ "$upgrade_count" -gt "$MAX_UPGRADES" ]; then
echo "警告: 有 $upgrade_count 个包需要升级,超过阈值 $MAX_UPGRADES" >> "$UPGRADE_LOG"
# 可以发送邮件通知管理员
fi
# 列出可升级的包
echo "可升级的包:" >> "$UPGRADE_LOG"
apt list --upgradable 2>/dev/null | grep "upgradable" >> "$UPGRADE_LOG"
fi
#!/bin/bash
# 分析软件包依赖树
analyze_deps() {
local package="$1"
if [ -z "$package" ]; then
echo "用法: $0 软件包名"
return 1
fi
echo "=== $package 依赖分析 ==="
echo ""
# 依赖关系
echo "1. 依赖的包:"
apt depends "$package" | grep -E "^ 依赖|^ 预依赖" | sort | uniq
echo ""
echo "2. 被哪些包依赖:"
apt rdepends "$package" | tail -n +2
echo ""
echo "3. 提供的文件:"
dpkg -L "$package" 2>/dev/null | head -20
}
# 使用示例
analyze_deps nginx
#!/bin/bash
# 备份已安装的软件包列表
BACKUP_DIR="/backup/apt_packages"
BACKUP_FILE="$BACKUP_DIR/installed_packages_$(date +%Y%m%d).txt"
mkdir -p "$BACKUP_DIR"
echo "=== 备份已安装的软件包 ==="
echo "备份时间: $(date)" > "$BACKUP_FILE"
echo "" >> "$BACKUP_FILE"
# 备份所有已安装的包
dpkg --get-selections | grep -v deinstall > "$BACKUP_FILE"
echo "备份完成: $BACKUP_FILE"
# 恢复软件包(从备份)
# dpkg --set-selections < "$BACKUP_FILE"
# apt-get dselect-upgrade
#!/bin/bash
# 切换到国内镜像源(以Ubuntu为例)
MIRROR_URL="http://mirrors.aliyun.com/ubuntu/"
backup_sources() {
sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup.$(date +%Y%m%d)
echo "已备份源列表"
}
change_mirror() {
local codename=$(lsb_release -cs)
echo "检测到系统代号: $codename"
echo "切换到阿里云镜像源..."
sudo tee /etc/apt/sources.list << EOF
deb ${MIRROR_URL} ${codename} main restricted universe multiverse
deb ${MIRROR_URL} ${codename}-security main restricted universe multiverse
deb ${MIRROR_URL} ${codename}-updates main restricted universe multiverse
deb ${MIRROR_URL} ${codename}-proposed main restricted universe multiverse
deb ${MIRROR_URL} ${codename}-backports main restricted universe multiverse
deb-src ${MIRROR_URL} ${codename} main restricted universe multiverse
deb-src ${MIRROR_URL} ${codename}-security main restricted universe multiverse
deb-src ${MIRROR_URL} ${codename}-updates main restricted universe multiverse
deb-src ${MIRROR_URL} ${codename}-proposed main restricted universe multiverse
deb-src ${MIRROR_URL} ${codename}-backports main restricted universe multiverse
EOF
echo "更新软件包列表..."
sudo apt update
}
# 执行
backup_sources
change_mirror
A: 这通常是因为系统时间不正确:
# 检查系统时间
date
# 同步网络时间
sudo apt install ntpdate
sudo ntpdate pool.ntp.org
# 或者使用timedatectl(systemd系统)
sudo timedatectl set-ntp true
sudo timedatectl status
# 更新硬件时钟
sudo hwclock --systohc
A: 尝试以下解决方法:
# 修复损坏的依赖关系
sudo apt --fix-broken install
# 修复依赖关系并清理
sudo apt install -f
sudo apt autoremove
# 清除缓存并重新配置
sudo apt clean
sudo apt update
sudo dpkg --configure -a
# 如果问题仍然存在,尝试强制重装
sudo apt install --reinstall 包名
A: 可以使用以下方法降级:
# 查看可用版本
apt-cache policy 包名
# 安装特定版本
sudo apt install 包名=版本号
# 示例:降级nginx
sudo apt install nginx=1.18.0-0ubuntu1
# 如果安装失败,可能需要先清除
sudo apt remove 包名
sudo apt install 包名=版本号
A: 建议:
# 脚本中建议使用apt-get
sudo apt-get update
sudo apt-get install -y nginx
# 交互式可以使用apt
sudo apt update
sudo apt install nginx
A: 软件源GPG密钥问题:
# 重新导入密钥
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 密钥ID
# 或者删除有问题的密钥
sudo apt-key del 密钥ID
# 对于新的apt版本(>=1.1),使用
sudo apt update --allow-insecure-repositories
# 删除有问题的源文件
sudo rm /etc/apt/sources.list.d/有问题的源.list
sudo apt update
full-upgrade,可能删除重要软件包/var/cache/apt/archives/避免磁盘空间不足/etc/apt/sources.listsudo apt update && sudo apt upgradeapt-mark hold保持关键软件包版本