#!/bin/bash set -uo pipefail # 启用严格错误处理 / Enable strict error handling # ---------- 定义变量 / Define variables ---------- APP_NAME="Navicat Premium" APP_SUPPORT_DIR="$HOME/Library/Application Support/PremiumSoft CyberTech/Navicat CC/Navicat Premium" PLIST_FILE="$HOME/Library/Preferences/com.navicat.NavicatPremium.plist" KEYCHAIN_SERVICE="com.navicat.NavicatPremium" # ---------- 终止 Navicat 进程 / Terminate Navicat process ---------- echo "正在终止 $APP_NAME 进程... / Terminating $APP_NAME process..." if pkill -9 "$APP_NAME" 2>/dev/null; then echo "已成功终止正在运行的 $APP_NAME 进程。/ Successfully terminated running $APP_NAME process." else echo "$APP_NAME 进程未在运行,跳过终止。/ $APP_NAME process not running, skipping termination." fi # ---------- 清理应用支持目录的哈希文件 / Cleaning hash files in app support directory ---------- echo "清理应用支持目录的哈希文件... / Cleaning hash files in app support directory..." find "$APP_SUPPORT_DIR" -maxdepth 1 -type f -name '.[0-9A-F][0-9A-F]*' 2>/dev/null | \ while IFS= read -r file; do filename=$(basename "$file") # 基础正则表达式匹配 32 位哈希 / Basic regex to match 32-character hash if echo "$filename" | grep -Eq '^\.([0-9A-F]{32})$'; then echo "删除哈希文件: $filename / Deleting hash file: $filename" rm -f "$file" fi done # ---------- 处理偏好设置文件 / Handling preferences plist file ---------- echo "处理偏好设置文件... / Processing preferences plist file..." if [[ -f "$PLIST_FILE" ]]; then # 获取所有符合32位哈希格式的顶级键 / Get all top-level keys matching 32-character hash keys_to_delete=$(/usr/libexec/PlistBuddy -c "Print" "$PLIST_FILE" | grep -Eoa "^\s{4}[0-9A-F]{32}" | tr -d ' ') if [[ -n "$keys_to_delete" ]]; then while IFS= read -r key; do echo "正在删除密钥: $key / Deleting key: $key" /usr/libexec/PlistBuddy -c "Delete :$key" "$PLIST_FILE" 2>/dev/null || true done <<< "$keys_to_delete" else echo "未找到需要删除的32位哈希密钥。/ No 32-character hash keys found to delete." fi else echo "偏好设置文件不存在: $PLIST_FILE / Preferences plist file not found: $PLIST_FILE" fi # ---------- 清理钥匙串中的试用期追踪条目 / Clean trial tracking entries in Keychain ---------- echo "清理钥匙串中的试用期追踪条目... / Cleaning trial tracking entries in Keychain..." # 获取所有 Navicat 钥匙串条目的账户名 / Get all Navicat keychain entry account names # 使用 awk 提取紧跟在服务名后的账户名 / Use awk to extract account names following service name keychain_accounts=$(security dump-keychain ~/Library/Keychains/login.keychain-db 2>/dev/null | \ awk '/0x00000007.*'"$KEYCHAIN_SERVICE"'/{found=1} found && /"acct"/{print; found=0}' | \ sed 's/.*="\([^"]*\)".*/\1/') deleted_count=0 if [[ -n "$keychain_accounts" ]]; then while IFS= read -r account; do # 只删除32位哈希格式的账户(试用期追踪),保留用户的连接密码 # Only delete 32-character hash accounts (trial tracking), preserve user connection passwords if echo "$account" | grep -Eq '^[0-9A-F]{32}$'; then echo "删除钥匙串条目: $account / Deleting keychain entry: $account" security delete-generic-password -s "$KEYCHAIN_SERVICE" -a "$account" >/dev/null 2>&1 || true ((deleted_count++)) fi done <<< "$keychain_accounts" fi if [[ $deleted_count -eq 0 ]]; then echo "未找到需要删除的钥匙串条目。/ No keychain entries found to delete." else echo "已删除 $deleted_count 个钥匙串条目。/ Deleted $deleted_count keychain entries." fi