禁止ubuntu自动更新脚本

按照如下指令创建脚本,赋予运行权限,运行

  1. touch disable-auto-updates.sh
  2. chmod +x disable-auto-updates.sh
  3. ./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' 以确保系统安全!"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值