按照如下指令创建脚本,赋予运行权限,运行
touch disable-auto-updates.shchmod +x disable-auto-updates.sh./disable-auto-updates.sh
脚本具体内容如下
#!/bin/bash
# disable-auto-updates.sh
# 用于在 Ubuntu/Debian 系统上彻底禁用自动更新机制
# 包括:APT 自动更新、Snap 自动刷新、Canonical Livepatch
#
# ⚠️ 警告:禁用自动更新将使系统无法自动获取安全补丁!
# 请确保你了解风险,并会定期手动更新系统。
set -euo pipefail # 严格模式:出错即停、未定义变量报错、管道失败即停
# 颜色输出(可选,提升可读性)
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
log() {
echo -e "${GREEN}[INFO]${NC} $1"
}
warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
error() {
echo -e "${RED}[ERROR]${NC} $1" >&2
exit 1
}
# 检查是否以 root 运行(不推荐),建议用普通用户 + sudo
if [[ $EUID == 0 ]]; then
error "请不要以 root 用户直接运行此脚本。使用普通用户并确保 sudo 可用。"
fi
# 检查 sudo 权限
if ! sudo -n true 2>/dev/null; then
log "需要 sudo 权限,请输入密码:"
sudo -v || error "sudo 认证失败,退出。"
fi
log "开始禁用系统自动更新机制..."
# ==============================
# 步骤 1:禁用 APT 自动更新
# ==============================
log "步骤 1/4:禁用 APT 自动更新..."
sudo tee /etc/apt/apt.conf.d/99-disable-updates.conf >/dev/null <<EOF
APT::Periodic::Update-Package-Lists "0";
APT::Periodic::Download-Upgradeable-Packages "0";
APT::Periodic::AutocleanInterval "0";
APT::Periodic::Unattended-Upgrade "0";
EOF
# 停止并禁用 unattended-upgrades 服务(如果存在)
if systemctl is-active --quiet unattended-upgrades 2>/dev/null; then
sudo systemctl stop unattended-upgrades
fi
if systemctl is-enabled --quiet unattended-upgrades 2>/dev/null; then
sudo systemctl disable unattended-upgrades
fi
# 可选:彻底移除 unattended-upgrades 包(默认注释,按需启用)
# warn "正在移除 unattended-upgrades 包(取消注释以启用)..."
# sudo apt remove --purge unattended-upgrades -y
# 禁用 cron 中的 APT 脚本(防止 fallback 行为)
if [ -f /etc/cron.daily/apt-compat ]; then
sudo chmod -x /etc/cron.daily/apt-compat
log "已禁用 /etc/cron.daily/apt-compat(移除执行权限)"
fi
if [ -f /etc/cron.daily/apt ]; then
sudo chmod -x /etc/cron.daily/apt
log "已禁用 /etc/cron.daily/apt(移除执行权限)"
fi
# ==============================
# 步骤 2:禁用 Snap 自动更新
# ==============================
log "步骤 2/4:禁用 Snap 自动更新..."
if command -v snap &>/dev/null; then
# 设置永久暂停(直到 2050 年,模拟 forever)
sudo snap set system refresh.hold="$(date -d '2050-01-01' -u +%Y-%m-%dT%H:%M:%S%:z)"
log "Snap 自动刷新已暂停至 2050 年(等效永久禁用)"
else
log "Snap 未安装,跳过此步骤。"
fi
# ==============================
# 步骤 3:禁用 Canonical Livepatch
# ==============================
log "步骤 3/4:检查并禁用 Canonical Livepatch..."
if command -v canonical-livepatch &>/dev/null; then
if sudo canonical-livepatch status --verbose 2>/dev/null | grep -q 'fully-enabled: true'; then
log "Livepatch 已启用,正在禁用..."
sudo canonical-livepatch disable
log "Canonical Livepatch 已禁用。"
else
log "Canonical Livepatch 已处于禁用或未激活状态。"
fi
else
log "Canonical Livepatch 未安装,跳过此步骤。"
fi
# ==============================
# 步骤 4:验证配置
# ==============================
log "步骤 4/4:验证配置是否生效..."
echo
echo "=== APT 自动更新配置 ==="
apt-config dump | grep -E "APT::Periodic::(Update-Package-Lists|Unattended-Upgrade|Download-Upgradeable-Packages|AutocleanInterval)" | sort
echo
echo "=== unattended-upgrades 服务状态 ==="
if systemctl list-unit-files | grep -q unattended-upgrades; then
echo "Active: $(systemctl is-active unattended-upgrades 2>&1 || echo 'inactive')"
echo "Enabled: $(systemctl is-enabled unattended-upgrades 2>&1 || echo 'disabled')"
else
echo "Service: not installed"
fi
echo
echo "=== Snap 自动刷新状态 ==="
if command -v snap &>/dev/null; then
echo "Refresh hold: $(snap get system refresh.hold 2>/dev/null || echo 'not set')"
else
echo "Snap: not installed"
fi
echo
echo "=== Canonical Livepatch 状态 ==="
if command -v canonical-livepatch &>/dev/null; then
canonical-livepatch status 2>/dev/null || echo "Livepatch: error getting status"
else
echo "Livepatch: not installed"
fi
echo
log "✅ 自动更新禁用操作已完成。"
warn "请定期手动运行 'sudo apt update && sudo apt upgrade' 以确保系统安全!"

2441

被折叠的 条评论
为什么被折叠?



