我写了一个脚本
toggle_apple_hosts.sh ,终端执行 sudo sh
toggle_apple_hosts.sh 可自动切换是否更新系统,执行后重启电脑,小红点即可消失:
```bash
#!/bin/bash
# 确保脚本以 root 权限运行
if [ "$EUID" -ne 0 ]; then
echo "权限不足,请使用 sudo 运行此脚本: sudo $0"
exit 1
fi
HOSTS_FILE="/etc/hosts"
# 使用其中一个需要切换的域名作为状态判断基准
CHECK_DOMAIN="
swdist.apple.com"
# 检查 hosts 文件中是否已存在这些域名
if ! grep -q "$CHECK_DOMAIN" "$HOSTS_FILE"; then
echo "错误:未在 $HOSTS_FILE 中找到相关域名,请先按照配置更新 hosts 文件。"
exit 1
fi
# 检查当前是否已被注释 (行首以 # 开头并包含该域名)
if grep -q "^#.*$CHECK_DOMAIN" "$HOSTS_FILE"; then
echo "当前状态: [已放行] 系统更新(规则被注释)。"
echo "正在切换为 -> [拦截] 模式 (仅拦截系统更新,保留 App Store)..."
# 仅取消注释特定的 6 个域名(同时生效于 IPv4 和 IPv6 )
sed -i '' -e '/
swdist.apple.com/ s/^#*//' \
-e '/
swdownload.apple.com/ s/^#*//' \
-e '/
swcdn.apple.com/ s/^#*//' \
-e '/
gdmf.apple.com/ s/^#*//' \
-e '/
xp.apple.com/ s/^#*//' \
-e '/
mesu.apple.com/ s/^#*//' "$HOSTS_FILE"
else
echo "当前状态: [已拦截] 系统更新(规则生效中)。"
echo "正在切换为 -> [放行] 模式..."
# 仅为特定的 6 个域名添加注释(同时生效于 IPv4 和 IPv6 )
sed -i '' -e '/
swdist.apple.com/ s/^/#/' \
-e '/
swdownload.apple.com/ s/^/#/' \
-e '/
swcdn.apple.com/ s/^/#/' \
-e '/
gdmf.apple.com/ s/^/#/' \
-e '/
xp.apple.com/ s/^/#/' \
-e '/
mesu.apple.com/ s/^/#/' "$HOSTS_FILE"
fi
# 刷新 DNS 缓存
echo "正在刷新 macOS DNS 缓存..."
dscacheutil -flushcache
killall -HUP mDNSResponder
echo "切换完成!"
```