目录

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

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

一、现象:薛定谔的 Bing

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

  • Microsoft Bing Wallpaper(必应壁纸)
  • Microsoft Bing for Safari(Safari 里的必应组件)

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

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


二、排查思路:谁在动我的应用?

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

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

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


三、逐步排查(附真实命令与输出)

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

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 安装记录

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,看清它多久跑一次、跑什么

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

关键字段一目了然:

# 系统守护进程(罪魁祸首)
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. 找到真正的执行体

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. 日志铁证

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

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

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. 安装来源确认

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 WallpaperBing 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-updatersunfish-updater-launcher
  • 用户启动项:Microsoft Bing Wallpaper.plist(登录隐藏自启)
  • pkg 记录:com.microsoft.bing.sunfish.updatercom.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

#!/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 跑也行)
chmod +x remove-bing-autoinstall.sh

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

七、验证与预防

跑完脚本并重启后,用下面两条验证(都应无输出才算干净):

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

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

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 上实测,清理前请务必确认路径、做好备份。操作涉及系统目录,请谨慎执行。