# 我的 Mac 为什么总在偷偷重装 Bing


我的 Mac 为什么总在偷偷重装 Bing？一次"删了又装"的排查实录
如果你也遇到过"明明手动删掉了某个 App，过几天它又自己回来了"的情况，这篇文章也许能帮你少走弯路
<!--more-->

## 一、现象：薛定谔的 Bing

某天我打开"启动台"，赫然发现两个从没主动想留着的 App 又冒出来了：

- **Microsoft Bing Wallpaper**（必应壁纸）
- **Microsoft Bing for Safari**（Safari 里的必应组件）

我明明手动删过好几次。删完当时是干净的，但过段时间——有时是第二天，有时是隔几天——它们又不声不响地回来了。像打不死的小强。

直觉告诉我：这不是巧合，背后一定有个"自动安装器"在周期性地还原它们。于是我决定把这只幕后黑手揪出来。

---

## 二、排查思路：谁在动我的应用？

macOS 上"偷偷自动装东西"的常见来源就那么几类，我按可能性从高到低逐一排查：

1. **LaunchDaemon / LaunchAgent**：开机或定时执行的系统/用户任务（最常见的元凶）
2. **pkg 安装记录**：系统里残留的 `.pkg` receipt，可能触发"修复式重装"
3. **正在运行的进程**：有没有微软相关的后台进程在轮询
4. **安装日志**：如果能找到安装日志，那就是铁证

排查全程**只做只读操作**（看文件、列目录、读配置），不动任何东西，确认原因后再动手。

---

## 三、逐步排查（附真实命令与输出）

### 1. 先看启动项里有没有微软/Bing 的影子

```bash
ls -1 /Library/LaunchDaemons/ | grep -iE "microsoft|bing|auto"
ls -1 /Library/LaunchAgents/ | grep -iE "microsoft|bing|auto"
ls -1 ~/Library/LaunchAgents/ | grep -iE "microsoft|bing|auto"
```

结果直接命中两个：

```
/Library/LaunchDaemons/com.microsoft.bing.sunfish.updater.plist   # 系统级守护进程
~/Library/LaunchAgents/Microsoft Bing Wallpaper.plist             # 用户级启动项
```

> 注意区分：`/Library/LaunchDaemons/`（系统级，需 root）和 `~/Library/LaunchAgents/`（用户级）。
> 系统级那个，往往就是"删不掉"的根源——因为它以 root 身份运行，权限比你还高。

### 2. 查 pkg 安装记录

```bash
ls -1 /var/db/receipts/ | grep -iE "bing|microsoft"
```

```
com.microsoft.bing.sunfish.updater.bom
com.microsoft.bing.sunfish.updater.plist
com.microsoft.bing.wallpaper.installer.bom
com.microsoft.bing.wallpaper.installer.plist
```

说明这两样东西当初是**通过标准 pkg 安装器装进来的**，而且系统里还记着账。

### 3. 解析这两个 plist，看清它多久跑一次、跑什么

```bash
plutil -p "/Library/LaunchDaemons/com.microsoft.bing.sunfish.updater.plist"
plutil -p "$HOME/Library/LaunchAgents/Microsoft Bing Wallpaper.plist"
```

关键字段一目了然：

```text
# 系统守护进程（罪魁祸首）
Label          => com.microsoft.bing.sunfish.updater
ProgramArguments => ["/usr/local/bin/sunfish-updater"]
RunAtLoad      => true          # 开机/登录就跑
StartInterval  => 3600          # 每 3600 秒（1 小时）跑一次
UserName       => root           # 以 root 身份运行

# 用户启动项（帮凶）
Label          => Microsoft Bing Wallpaper
ProgramArguments => ["/Applications/Microsoft Bing Wallpaper.app/.../bingwallpaperapp", "--hidden"]
RunAtLoad      => true          # 登录后把壁纸 App 隐藏自启
```

看到这里基本破案了：`sunfish-updater` 是个 **root 守护进程，每小时执行一次**，而 `sunfish` 是微软内部给 **"Bing for Safari"** 起的代号。

### 4. 找到真正的执行体

```bash
ls -la /usr/local/bin/ | grep -iE "microsoft|bing|sunfish"
```

```
-rwxr-xr-x  root  wheel  11890032  sunfish-updater
-rwxr-xr-x  root  wheel   956224    sunfish-updater-launcher
```

`sunfish-updater` 是一个 **11.8 MB 的编译二进制（Mach-O）**，不是脚本。它静静躺在 `/usr/local/bin/`，每小时被守护进程叫起来干坏事。

### 5. 日志铁证

```bash
tail -n 20 "/Library/Logs/Microsoft/Sunfish/Updater/launchd.out.log"
```

日志把"自动重装"写得明明白白：

```text
installer: Package name is Microsoft Bing Wallpaper
installer: Upgrading at base path /
installer: The upgrade was successful.
（重复多次）
```

也就是说，这个守护进程本质上是**偷偷调用 macOS 自带的 `installer` 命令，从缓存的 pkg 把 Bing 应用重新装回去**。你手动删 App，删的只是它的"产出物"，它下个小时照装不误。

而且日志目录的修改时间是**当天 17:54**——说明它几个小时前还在勤勤恳恳地帮你"重装"。

### 6. 安装来源确认

```bash
plutil -p /var/db/receipts/com.microsoft.bing.sunfish.updater.plist
plutil -p /var/db/receipts/com.microsoft.bing.wallpaper.installer.plist
```

```
com.microsoft.bing.sunfish.updater  => InstallDate 2026-08-06, PackageFileName "SunfishUpdater.KYCf1odOzs.pkg"
com.microsoft.bing.wallpaper.installer => InstallDate 2026-08-20, PackageFileName "BingWallpaper-component.pkg"
```

结合时间点判断：最初应该是某次安装 **Microsoft Bing Wallpaper** 或 **Bing for Safari**（也可能来自 Microsoft Edge 的 Bing 相关组件）时，安装包顺手塞了这么一个"常驻更新/保活"守护进程。后来卸载 App 时，这个守护进程并没被带走，于是就一直每小时帮你免费重装。

---

## 四、根因总结

一句话：**不是你手滑，是微软埋了个 root 级后台守护进程，每小时调用系统安装器还原 Bing 应用。**

完整链路：

```
某次安装 Bing 相关组件
        ↓
写入 root 守护进程 com.microsoft.bing.sunfish.updater
（/Library/LaunchDaemons/...plist + /usr/local/bin/sunfish-updater）
        ↓
每小时(StartInterval=3600) + 开机(RunAtLoad)
        ↓
sunfish-updater 调用 installer 从缓存 pkg 重装
Microsoft Bing Wallpaper / Bing for Safari
        ↓
你手动删 App → 下个周期又被装回  ← 死循环
```

配套残留：
- 系统守护进程 + 二进制：`sunfish-updater`、`sunfish-updater-launcher`
- 用户启动项：`Microsoft Bing Wallpaper.plist`（登录隐藏自启）
- pkg 记录：`com.microsoft.bing.sunfish.updater`、`com.microsoft.bing.wallpaper.installer`
- 应用本体：`/Applications/Microsoft Bing Wallpaper.app`、`/Applications/Microsoft Bing for Safari.app`

---

## 五、解决思路

要彻底断根，必须**连守护进程一起删**，只删 App 没用。完整清单：

| 类型 | 路径 | 作用 |
|---|---|---|
| 系统守护进程 | `/Library/LaunchDaemons/com.microsoft.bing.sunfish.updater.plist` | 每小时重装的根因 |
| 二进制程序 | `/usr/local/bin/sunfish-updater`、`/usr/local/bin/sunfish-updater-launcher` | 实际执行重装 |
| 用户启动项 | `~/Library/LaunchAgents/Microsoft Bing Wallpaper.plist` | 登录自启壁纸 |
| 应用本体 | `/Applications/Microsoft Bing Wallpaper.app`、`/Applications/Microsoft Bing for Safari.app` | 被重装的目标 |
| 安装记录(可选) | `/var/db/receipts/com.microsoft.bing.*` | 让系统"忘记"装过 |

> ⚠️ 注意：系统级文件（`/Library`、`/usr/local/bin`）删除需要 **sudo（管理员密码）**。任何清理操作前请先退掉正在运行的 Bing Wallpaper 程序。

---

## 六、一键清理脚本

下面是我整理的清理脚本，特点：

- **带二次确认**，避免误删
- **路径全部写死、无通配符**，不会误伤其他文件
- 覆盖：停进程 → 卸守护进程 → 删二进制 → 卸用户启动项 → 删应用 → 清除 pkg 记录
- 步骤带编号，跑的时候心里有数

把内容保存为 `remove-bing-autoinstall.sh`：

```bash
#!/bin/bash
# ============================================================
# 清理 Microsoft Bing 自动重装机制 (sunfish-updater)
# 背景:
#   你的 Mac 上有一个 root 级守护进程 com.microsoft.bing.sunfish.updater，
#   每 1 小时调用 macOS installer 把 "Microsoft Bing Wallpaper" / "Bing for Safari"
#   重新装回来。删除应用本体没用，必须连同这个守护进程一起干掉。
# 用法:
#   1) 先手动退出 "Microsoft Bing Wallpaper" 程序
#   2) 终端运行:  sudo bash /path/to/remove-bing-autoinstall.sh
#   3) 按提示输入 y 确认
#   4) 跑完建议重启一次
# ============================================================

set -u  # 遇到未定义变量直接报错（不用 set -e，避免单步失败中断整体）

echo "=================================================="
echo " Microsoft Bing 自动重装清理脚本"
echo " 将移除: sunfish 守护进程 / 二进制 / 启动项 / 应用"
echo "=================================================="

# ---- 安全检查：必须以 root(sudo) 运行 ----
if [ "$(id -u)" -ne 0 ]; then
  echo "❌ 请用 sudo 运行本脚本:  sudo bash $0"
  exit 1
fi

# ---- 二次确认，防止误删 ----
read -r -p "⚠️ 即将删除 Bing 相关的守护进程、二进制、启动项与应用，确认继续? [y/N] " CONFIRM
if [ "$CONFIRM" != "y" ] && [ "$CONFIRM" != "Y" ]; then
  echo "已取消。"
  exit 0
fi

# 取得当前登录用户及其家目录（脚本以 root 运行时 $HOME 是 /var/root，不能用）
CURRENT_USER=$(stat -f '%Su' /dev/console 2>/dev/null || echo "$SUDO_USER")
USER_HOME=$(dscl . -read "/Users/$CURRENT_USER" NFSHomeDirectory 2>/dev/null | awk '{print $2}')
[ -z "$USER_HOME" ] && USER_HOME="$HOME"
echo "当前登录用户: $CURRENT_USER  (家目录: $USER_HOME)"

# ---------- 1. 终止正在运行的 sunfish 进程 ----------
echo "[1/6] 终止 sunfish-updater 进程..."
sudo pkill -f "sunfish-updater" 2>/dev/null && echo "  已终止" || echo "  无运行进程"

# ---------- 2. 卸载并删除系统级守护进程 ----------
echo "[2/6] 卸载系统守护进程 com.microsoft.bing.sunfish.updater ..."
sudo launchctl bootout system/com.microsoft.bing.sunfish.updater 2>/dev/null || true
sudo launchctl unload /Library/LaunchDaemons/com.microsoft.bing.sunfish.updater.plist 2>/dev/null || true
if [ -f /Library/LaunchDaemons/com.microsoft.bing.sunfish.updater.plist ]; then
  sudo rm -f /Library/LaunchDaemons/com.microsoft.bing.sunfish.updater.plist
  echo "  已删除 plist"
else
  echo "  plist 不存在（已删或从未存在）"
fi

# ---------- 3. 删除 sunfish 二进制程序 ----------
echo "[3/6] 删除 /usr/local/bin 下的 sunfish 二进制..."
for bin in /usr/local/bin/sunfish-updater /usr/local/bin/sunfish-updater-launcher; do
  if [ -e "$bin" ]; then
    sudo rm -f "$bin"
    echo "  已删除 $bin"
  else
    echo "  $bin 不存在"
  fi
done

# ---------- 4. 卸载并删除用户级 Bing Wallpaper 启动项 ----------
echo "[4/6] 卸载用户启动项 Microsoft Bing Wallpaper ..."
AGENT_PLIST="$USER_HOME/Library/LaunchAgents/Microsoft Bing Wallpaper.plist"
if [ -n "$CURRENT_USER" ]; then
  sudo -u "$CURRENT_USER" launchctl unload "$AGENT_PLIST" 2>/dev/null || true
fi
if [ -f "$AGENT_PLIST" ]; then
  rm -f "$AGENT_PLIST"
  echo "  已删除用户 plist"
else
  echo "  用户 plist 不存在"
fi

# ---------- 5. 删除应用本体（仅这两个写死的路径，无通配符） ----------
echo "[5/6] 删除 Bing 应用..."
for app in "/Applications/Microsoft Bing Wallpaper.app" "/Applications/Microsoft Bing for Safari.app"; do
  if [ -d "$app" ]; then
    sudo rm -rf "$app"
    echo "  已删除 $app"
  else
    echo "  $app 不存在"
  fi
done

# ---------- 6. 清除 pkg 安装记录(receipts) ----------
echo "[6/6] 清除 pkg 安装记录..."
for pkg in com.microsoft.bing.sunfish.updater com.microsoft.bing.wallpaper.installer; do
  sudo pkgutil --forget "$pkg" 2>/dev/null && echo "  已 forget $pkg" || echo "  $pkg 无记录"
done

echo "=================================================="
echo " 清理完成！建议重启一次以确认不再自动重装。"
echo " 验证命令:  ls /Library/LaunchDaemons/ | grep -i bing   (应无输出)"
echo "            ls \"$USER_HOME/Library/LaunchAgents/\" | grep -i bing  (应无输出)"
echo "=================================================="
```

### 运行方式

```bash
# 先给脚本加执行权限（可选，用 bash 跑也行）
chmod +x remove-bing-autoinstall.sh

# 退出 Bing Wallpaper 程序后，用 sudo 运行
sudo bash remove-bing-autoinstall.sh
```

---

## 七、验证与预防

跑完脚本并重启后，用下面两条验证（**都应无输出**才算干净）：

```bash
ls /Library/LaunchDaemons/ | grep -i bing
ls ~/Library/LaunchAgents/ | grep -i bing
```

还可以再确认二进制和应用都没了：

```bash
ls /usr/local/bin/ | grep -i sunfish      # 应无输出
ls /Applications/ | grep -i bing          # 应无输出
```

**预防建议：**

- 以后安装微软系的小工具（Bing Wallpaper、Bing for Safari、甚至某些 Edge 组件）时，多留意安装选项，能不勾"随系统启动/自动更新"就不勾。
- 真要装，装完记得顺手检查 `/Library/LaunchDaemons/` 有没有新增微软相关的 plist——发现 `sunfish` 之类名字直接警惕。
- 判断"是不是又回来了"，别急着删 App，先回看上面两个目录；只要守护进程没了，它就再也回不来了。

---

## 八、结语

这次排查给我最大的感触是：**在 macOS 上，删 App ≠ 卸载干净**。App 只是表象，真正决定它"会不会复活"的，是那些藏在 `/Library/LaunchDaemons`、`/usr/local/bin` 里的守护进程和二进制。遇到"删了又来"的软件，别跟 App 较劲，去查启动项和日志，根因往往一目了然。

希望这篇能帮到同样被 Bing "阴魂不散"折磨过的你。如果排查到其他有趣的"自动复活"案例，也欢迎交流。

---

*本文所有命令均已在 macOS 上实测，清理前请务必确认路径、做好备份。操作涉及系统目录，请谨慎执行。*

