diff --git a/scripts/run/cursor_mac_id_modifier.sh b/scripts/run/cursor_mac_id_modifier.sh index 171f10b..bf2bf24 100644 --- a/scripts/run/cursor_mac_id_modifier.sh +++ b/scripts/run/cursor_mac_id_modifier.sh @@ -111,132 +111,11 @@ remove_cursor_trial_folders() { echo done - # 🔧 重要:深度修复权限问题 - log_info "🔧 [深度修复] 正在进行全面的权限修复..." - local cursor_support_dir="$HOME/Library/Application Support/Cursor" - local cursor_home_dir="$HOME/.cursor" - - # 创建完整的目录结构(包括Cursor可能需要的所有子目录) - local directories=( - "$cursor_support_dir" - "$cursor_support_dir/User" - "$cursor_support_dir/User/globalStorage" - "$cursor_support_dir/User/workspaceStorage" - "$cursor_support_dir/User/History" - "$cursor_support_dir/logs" - "$cursor_support_dir/CachedData" - "$cursor_support_dir/CachedExtensions" - "$cursor_support_dir/CachedExtensionVSIXs" - "$cursor_home_dir" - "$cursor_home_dir/extensions" - ) - - log_info "[创建] 创建完整的目录结构..." - for dir in "${directories[@]}"; do - if mkdir -p "$dir" 2>/dev/null; then - log_debug "✅ 创建目录: $dir" - else - log_warn "⚠️ 创建目录失败: $dir" - fi - done - - # 设置递归权限(确保所有子目录都有正确权限) - log_info "🔐 [权限] 设置递归权限..." - chmod -R 755 "$cursor_support_dir" 2>/dev/null || true - chmod -R 755 "$cursor_home_dir" 2>/dev/null || true - - # 特别处理:确保当前用户拥有这些目录 - log_info "👤 [所有权] 确保目录所有权正确..." - chown -R "$(whoami)" "$cursor_support_dir" 2>/dev/null || true - chown -R "$(whoami)" "$cursor_home_dir" 2>/dev/null || true - - # 🔑 关键修复:执行用户提供的核心权限修复命令(解决EACCES错误) - log_info "🔑 [关键修复] 执行用户提供的核心权限修复命令..." - - # 执行用户明确要求的权限修复命令 - if sudo chown -R "$(whoami)" "$HOME/Library/Application Support/Cursor" 2>/dev/null; then - log_info "✅ [成功] sudo chown -R \$(whoami) ~/Library/\"Application Support\"/Cursor" - else - log_warn "⚠️ [警告] sudo chown Application Support/Cursor 失败" - fi - - if sudo chown -R "$(whoami)" "$HOME/.cursor" 2>/dev/null; then - log_info "✅ [成功] sudo chown -R \$(whoami) ~/.cursor" - else - log_warn "⚠️ [警告] sudo chown .cursor 失败" - fi - - # 🔓 关键修复:执行用户提供的写入权限修复命令 - log_info "🔓 [关键修复] 执行用户提供的写入权限修复命令..." - if chmod -R u+w "$HOME/Library/Application Support/Cursor" 2>/dev/null; then - log_info "✅ [成功] chmod -R u+w ~/Library/\"Application Support\"/Cursor" - else - log_warn "⚠️ [警告] chmod Application Support/Cursor 写入权限失败" - fi - - # 确保extensions目录存在并设置权限 - mkdir -p "$HOME/.cursor/extensions" 2>/dev/null || true - if chmod -R u+w "$HOME/.cursor/extensions" 2>/dev/null; then - log_info "✅ [成功] chmod -R u+w ~/.cursor/extensions" - else - log_warn "⚠️ [警告] chmod .cursor/extensions 写入权限失败" - fi - - # 验证权限设置 - log_info "🔍 [验证] 验证权限设置..." - local permission_ok=true - - # 检查目录是否可写 - if [ -w "$cursor_support_dir" ]; then - log_info "✅ [验证] Application Support/Cursor目录可写" - else - log_warn "⚠️ [验证] Application Support/Cursor目录不可写" - permission_ok=false - fi - - if [ -w "$cursor_home_dir" ]; then - log_info "✅ [验证] .cursor目录可写" - else - log_warn "⚠️ [验证] .cursor目录不可写" - permission_ok=false - fi - - # 检查关键子目录是否可写 - if [ -w "$cursor_support_dir/logs" ] || [ ! -d "$cursor_support_dir/logs" ]; then - log_info "✅ [验证] logs目录权限正常" - else - log_warn "⚠️ [验证] logs目录权限异常" - permission_ok=false - fi - - if $permission_ok; then - log_info "✅ [成功] 权限验证通过" - else - log_warn "⚠️ [警告] 权限验证失败,可能仍存在问题" - log_info "💡 [提示] 如果Cursor启动时仍有权限错误,请手动执行:" - echo " sudo chown -R \$(whoami) \"$HOME/Library/Application Support/Cursor\"" - echo " sudo chown -R \$(whoami) \"$HOME/.cursor\"" - echo " chmod -R u+w \"$HOME/Library/Application Support/Cursor\"" - echo " chmod -R u+w \"$HOME/.cursor\"" - fi - - # 🔍 权限诊断 - log_info "🔍 [诊断] 执行权限诊断..." - echo " 📁 目录权限检查:" - for dir in "${directories[@]}"; do - if [ -d "$dir" ]; then - local perms=$(ls -ld "$dir" | awk '{print $1, $3, $4}') - echo " ✅ $dir: $perms" - else - echo " ❌ $dir: 不存在" - fi - done - - log_info "✅ [完成] 深度权限修复完成" + # 🔧 重要:删除文件夹后立即执行权限修复 + log_info "� [权限修复] 删除文件夹后立即执行权限修复..." echo - # 🔧 额外修复:再次调用统一权限修复函数确保一致性 - log_info "🔧 [额外修复] 使用统一权限修复函数进行最终确认..." + # 调用统一的权限修复函数 ensure_cursor_directory_permissions # 显示操作统计 @@ -271,51 +150,9 @@ restart_cursor_and_wait() { return 1 fi - # 🔧 启动前最后一次权限确认 - log_info "🔧 [最终权限] 启动前最后一次权限确认..." - local cursor_support_dir="$HOME/Library/Application Support/Cursor" - local cursor_home_dir="$HOME/.cursor" - - # 再次确认完整目录结构存在 - local directories=( - "$cursor_support_dir" - "$cursor_support_dir/User" - "$cursor_support_dir/User/globalStorage" - "$cursor_support_dir/logs" - "$cursor_support_dir/CachedData" - "$cursor_home_dir" - "$cursor_home_dir/extensions" - ) - - for dir in "${directories[@]}"; do - mkdir -p "$dir" 2>/dev/null || true - done - - # 设置强制权限 - chmod -R 755 "$cursor_support_dir" 2>/dev/null || true - chmod -R 755 "$cursor_home_dir" 2>/dev/null || true - chown -R "$(whoami)" "$cursor_support_dir" 2>/dev/null || true - chown -R "$(whoami)" "$cursor_home_dir" 2>/dev/null || true - - # 🔑 最终权限修复:执行用户提供的完整权限修复命令 - log_info "🔑 [最终修复] 执行用户提供的完整权限修复命令确保启动前权限正确..." - - # 执行用户提供的完整权限修复序列 - sudo chown -R "$(whoami)" "$HOME/Library/Application Support/Cursor" 2>/dev/null || true - sudo chown -R "$(whoami)" "$HOME/.cursor" 2>/dev/null || true - chmod -R u+w "$HOME/Library/Application Support/Cursor" 2>/dev/null || true - - # 确保extensions目录存在并设置权限 - mkdir -p "$HOME/.cursor/extensions" 2>/dev/null || true - chmod -R u+w "$HOME/.cursor/extensions" 2>/dev/null || true - - log_info "✅ [最终修复] 用户提供的权限修复命令执行完成" - - # 🚀 关键修复:Cursor启动前权限最终确保 - ensure_cursor_startup_permissions - - # 🚨 额外修复:执行用户要求的关键权限修复 - fix_cursor_permissions_critical + # 🔧 启动前权限修复 + log_info "🔧 [启动前权限] 执行启动前权限修复..." + ensure_cursor_directory_permissions # 启动Cursor log_info "🚀 [启动] 正在启动Cursor..." @@ -437,11 +274,8 @@ start_cursor_to_generate_config() { log_info "📍 [路径] 使用Cursor路径: $cursor_executable" - # 🚀 关键修复:Cursor启动前权限最终确保 - ensure_cursor_startup_permissions - - # 🚨 额外修复:执行用户要求的关键权限修复 - fix_cursor_permissions_critical + # 🚀 启动前权限修复 + ensure_cursor_directory_permissions # 启动Cursor "$cursor_executable" > /dev/null 2>&1 & @@ -475,141 +309,61 @@ start_cursor_to_generate_config() { fi } -# 🛡️ 确保Cursor目录权限正确(简化版本) +# 🛡️ 统一权限修复函数(优化版本) ensure_cursor_directory_permissions() { - log_info "🛡️ [权限修复] 开始简化权限修复..." + log_info "🛡️ [权限修复] 执行核心权限修复命令..." local cursor_support_dir="$HOME/Library/Application Support/Cursor" local cursor_home_dir="$HOME/.cursor" - local current_user=$(whoami) - # 🔧 执行4个核心权限修复命令 - log_info "🔧 [修复] 执行核心权限修复命令..." + # 确保目录存在 + mkdir -p "$cursor_support_dir" 2>/dev/null || true + mkdir -p "$cursor_home_dir/extensions" 2>/dev/null || true + + # 🔧 执行用户验证有效的4个核心权限修复命令 + log_info "🔧 [修复] 执行4个核心权限修复命令..." - # 命令1: 修复Application Support/Cursor目录所有权 - log_info "🔑 [所有权] 修复Application Support/Cursor目录所有权..." - if sudo chown -R "$current_user" "$cursor_support_dir" 2>/dev/null; then - log_info "✅ [所有权] Application Support/Cursor目录所有权修复成功" + # 命令1: sudo chown -R $(whoami) ~/Library/"Application Support"/Cursor + if sudo chown -R "$(whoami)" "$cursor_support_dir" 2>/dev/null; then + log_info "✅ [1/4] sudo chown Application Support/Cursor 成功" else - log_error "❌ [所有权] Application Support/Cursor目录所有权修复失败" - return 1 + log_warn "⚠️ [1/4] sudo chown Application Support/Cursor 失败" fi - # 命令2: 修复.cursor目录所有权 - log_info "🔑 [所有权] 修复.cursor目录所有权..." - if sudo chown -R "$current_user" "$cursor_home_dir" 2>/dev/null; then - log_info "✅ [所有权] .cursor目录所有权修复成功" + # 命令2: sudo chown -R $(whoami) ~/.cursor + if sudo chown -R "$(whoami)" "$cursor_home_dir" 2>/dev/null; then + log_info "✅ [2/4] sudo chown .cursor 成功" else - log_error "❌ [所有权] .cursor目录所有权修复失败" - return 1 + log_warn "⚠️ [2/4] sudo chown .cursor 失败" fi - # 命令3: 设置Application Support/Cursor写入权限 - log_info "🔓 [写入权限] 设置Application Support/Cursor写入权限..." + # 命令3: chmod -R u+w ~/Library/"Application Support"/Cursor if chmod -R u+w "$cursor_support_dir" 2>/dev/null; then - log_info "✅ [写入权限] Application Support/Cursor写入权限设置成功" + log_info "✅ [3/4] chmod Application Support/Cursor 成功" else - log_error "❌ [写入权限] Application Support/Cursor写入权限设置失败" - return 1 + log_warn "⚠️ [3/4] chmod Application Support/Cursor 失败" fi - # 命令4: 设置.cursor/extensions写入权限 - log_info "🔓 [写入权限] 设置.cursor/extensions写入权限..." - local extensions_dir="$cursor_home_dir/extensions" - - # 确保extensions目录存在 - if [ ! -d "$extensions_dir" ]; then - mkdir -p "$extensions_dir" 2>/dev/null || true - fi - - if chmod -R u+w "$extensions_dir" 2>/dev/null; then - log_info "✅ [写入权限] .cursor/extensions写入权限设置成功" + # 命令4: chmod -R u+w ~/.cursor/extensions + if chmod -R u+w "$cursor_home_dir/extensions" 2>/dev/null; then + log_info "✅ [4/4] chmod .cursor/extensions 成功" else - log_error "❌ [写入权限] .cursor/extensions写入权限设置失败" - return 1 - fi - - # 🔍 验证权限修复结果 - log_info "🔍 [验证] 验证权限修复结果..." - - local verification_failed=false - - # 验证Application Support/Cursor目录 - if [ ! -w "$cursor_support_dir" ]; then - log_error "❌ [验证失败] Application Support/Cursor目录仍无写入权限" - verification_failed=true - fi - - # 验证.cursor目录 - if [ ! -w "$cursor_home_dir" ]; then - log_error "❌ [验证失败] .cursor目录仍无写入权限" - verification_failed=true - fi - - # 验证extensions目录 - if [ -d "$extensions_dir" ] && [ ! -w "$extensions_dir" ]; then - log_error "❌ [验证失败] .cursor/extensions目录仍无写入权限" - verification_failed=true - fi - - if [ "$verification_failed" = true ]; then - log_error "❌ [验证失败] 权限修复验证失败" - log_info "💡 [手动修复] 请手动执行以下命令:" - echo "sudo chown -R $current_user \"$cursor_support_dir\"" - echo "sudo chown -R $current_user \"$cursor_home_dir\"" - echo "chmod -R u+w \"$cursor_support_dir\"" - echo "chmod -R u+w \"$extensions_dir\"" - return 1 + log_warn "⚠️ [4/4] chmod .cursor/extensions 失败" fi - log_info "✅ [完成] 权限修复完成,所有验证通过" + log_info "✅ [完成] 核心权限修复命令执行完成" return 0 } -# 🚀 启动时权限预检查和修复(新增函数) -startup_permissions_check() { - log_info "🚀 [启动检查] 执行启动时权限预检查..." - - local cursor_support_dir="$HOME/Library/Application Support/Cursor" - local cursor_home_dir="$HOME/.cursor" - local needs_fix=false - - # 检查主要目录是否存在权限问题 - if [ -d "$cursor_support_dir" ] && [ ! -w "$cursor_support_dir" ]; then - log_warn "⚠️ [权限问题] 检测到Application Support/Cursor目录权限问题" - needs_fix=true - fi - - if [ -d "$cursor_home_dir" ] && [ ! -w "$cursor_home_dir" ]; then - log_warn "⚠️ [权限问题] 检测到.cursor目录权限问题" - needs_fix=true - fi - - # 特别检查logs目录(用户报告的具体问题) - local logs_dir="$cursor_support_dir/logs" - if [ -d "$logs_dir" ] && [ ! -w "$logs_dir" ]; then - log_warn "⚠️ [权限问题] 检测到logs目录权限问题(EACCES错误源头)" - needs_fix=true - fi - - # 如果检测到权限问题,调用简化的权限修复函数 - if $needs_fix; then - log_info "🔧 [预修复] 检测到权限问题,调用权限修复..." - ensure_cursor_directory_permissions - else - log_info "✅ [启动检查] 权限检查通过,无需修复" - fi -} - -# 🚨 关键权限修复函数(简化版本,调用统一权限修复) +# 关键权限修复函数(简化版本) fix_cursor_permissions_critical() { - log_info "🚨 [关键权限修复] 调用简化权限修复函数..." + log_info "🚨 [关键权限修复] 执行权限修复..." ensure_cursor_directory_permissions } -# 🚀 Cursor启动前权限最终确保(简化版本) +# 🚀 Cursor启动前权限确保(简化版本) ensure_cursor_startup_permissions() { - log_info "🚀 [启动前权限] 调用简化权限修复函数..." + log_info "🚀 [启动前权限] 执行权限修复..." ensure_cursor_directory_permissions } @@ -2841,8 +2595,9 @@ main() { initialize_log log_info "脚本启动..." - # 🚀 启动时权限预检查和修复(解决EACCES错误) - startup_permissions_check + # 🚀 启动时权限修复(解决EACCES错误) + log_info "🚀 [启动时权限] 执行启动时权限修复..." + ensure_cursor_directory_permissions # 记录系统信息 log_info "系统信息: $(uname -a)" @@ -3115,16 +2870,9 @@ main() { echo -e "${GREEN}================================${NC}" echo - # 🛡️ 关键修复:脚本执行完成前的最终权限修复 + # 🛡️ 脚本完成前最终权限修复 echo log_info "🛡️ [最终权限修复] 执行脚本完成前的最终权限修复..." - log_info "💡 [说明] 确保Cursor应用能够正常启动,无权限错误" - - # 执行权限修复 - ensure_cursor_directory_permissions - - # 最终权限修复确保 - log_info "🔍 [最终修复] 执行最终权限修复确保..." ensure_cursor_directory_permissions # 🎉 脚本执行完成 diff --git a/scripts/run/cursor_mac_id_modifier_new.sh b/scripts/run/cursor_mac_id_modifier_new.sh new file mode 100644 index 0000000..6eaff20 --- /dev/null +++ b/scripts/run/cursor_mac_id_modifier_new.sh @@ -0,0 +1,688 @@ +#!/bin/bash + +# ======================================== +# Cursor macOS 机器码修改脚本 (重构精简版) +# ======================================== +# +# 🎯 重构目标: +# - 简化脚本复杂度,从3158行压缩到约900行 +# - 自动化权限修复,解决EACCES权限错误 +# - 减少用户交互步骤,提升执行效率 +# - 保持所有原有功能完整性 +# +# 🚀 执行流程说明: +# 1. 环境检测和权限预修复 +# 2. 用户选择执行模式(仅修改 vs 完整重置) +# 3. 自动执行所有必要步骤 +# 4. 智能设备识别绕过(MAC地址或JS内核修改) +# 5. 自动权限修复和验证 +# +# ======================================== + +set -e + +# ==================== 核心配置 ==================== +LOG_FILE="/tmp/cursor_reset_$(date +%Y%m%d_%H%M%S).log" +CURSOR_APP_PATH="/Applications/Cursor.app" +STORAGE_FILE="$HOME/Library/Application Support/Cursor/User/globalStorage/storage.json" +BACKUP_DIR="$HOME/Library/Application Support/Cursor/User/globalStorage/backups" + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' + +# ==================== 统一工具函数 ==================== + +# 初始化日志 +init_log() { + echo "========== Cursor重构脚本执行日志 $(date) ==========" > "$LOG_FILE" + chmod 644 "$LOG_FILE" +} + +# 精简日志函数 +log() { + local level="$1" + local msg="$2" + local color="" + + case "$level" in + "INFO") color="$GREEN" ;; + "WARN") color="$YELLOW" ;; + "ERROR") color="$RED" ;; + *) color="$BLUE" ;; + esac + + echo -e "${color}[$level]${NC} $msg" + echo "[$level] $(date '+%H:%M:%S') $msg" >> "$LOG_FILE" +} + +# 统一权限管理器 - 解决所有权限问题 +fix_permissions() { + log "INFO" "🔧 执行统一权限修复..." + + local cursor_support="$HOME/Library/Application Support/Cursor" + local cursor_home="$HOME/.cursor" + + # 创建必要目录结构 + local dirs=( + "$cursor_support" + "$cursor_support/User" + "$cursor_support/User/globalStorage" + "$cursor_support/logs" + "$cursor_support/CachedData" + "$cursor_home" + "$cursor_home/extensions" + ) + + for dir in "${dirs[@]}"; do + mkdir -p "$dir" 2>/dev/null || true + done + + # 执行核心权限修复命令 + if sudo chown -R "$(whoami)" "$cursor_support" 2>/dev/null && \ + sudo chown -R "$(whoami)" "$cursor_home" 2>/dev/null && \ + chmod -R u+w "$cursor_support" 2>/dev/null && \ + chmod -R u+w "$cursor_home/extensions" 2>/dev/null; then + log "INFO" "✅ 权限修复成功" + return 0 + else + log "ERROR" "❌ 权限修复失败" + return 1 + fi +} + +# 环境检测器 +detect_environment() { + log "INFO" "🔍 检测系统环境..." + + # 检测macOS版本和硬件 + MACOS_VERSION=$(sw_vers -productVersion) + HARDWARE_TYPE=$(uname -m) + + if [[ "$HARDWARE_TYPE" == "arm64" ]]; then + HARDWARE_TYPE="Apple Silicon" + else + HARDWARE_TYPE="Intel" + fi + + # 检测兼容性 + local macos_major=$(echo "$MACOS_VERSION" | cut -d. -f1) + if [[ $macos_major -ge 14 ]] || [[ "$HARDWARE_TYPE" == "Apple Silicon" ]]; then + MAC_COMPATIBLE=false + log "WARN" "⚠️ 检测到MAC地址修改受限环境: macOS $MACOS_VERSION ($HARDWARE_TYPE)" + else + MAC_COMPATIBLE=true + log "INFO" "✅ 环境兼容性检查通过" + fi + + # 检查Python3 + if ! command -v python3 >/dev/null 2>&1; then + log "ERROR" "❌ 未找到Python3,请安装: brew install python3" + return 1 + fi + + # 检查Cursor应用 + if [ ! -d "$CURSOR_APP_PATH" ]; then + log "ERROR" "❌ 未找到Cursor应用: $CURSOR_APP_PATH" + return 1 + fi + + log "INFO" "✅ 环境检测完成: macOS $MACOS_VERSION ($HARDWARE_TYPE)" + return 0 +} + +# 进程管理器 +manage_cursor_process() { + local action="$1" # kill 或 start + + case "$action" in + "kill") + log "INFO" "🔄 关闭Cursor进程..." + pkill -f "Cursor" 2>/dev/null || true + sleep 2 + + # 验证是否关闭 + if pgrep -f "Cursor" >/dev/null; then + pkill -9 -f "Cursor" 2>/dev/null || true + sleep 2 + fi + log "INFO" "✅ Cursor进程已关闭" + ;; + "start") + log "INFO" "🚀 启动Cursor..." + "$CURSOR_APP_PATH/Contents/MacOS/Cursor" > /dev/null 2>&1 & + sleep 15 + log "INFO" "✅ Cursor已启动" + ;; + esac +} + +# 错误处理器 +handle_error() { + local error_msg="$1" + local recovery_action="$2" + + log "ERROR" "❌ 错误: $error_msg" + + if [ -n "$recovery_action" ]; then + log "INFO" "🔄 尝试恢复: $recovery_action" + eval "$recovery_action" + fi + + log "INFO" "💡 如需帮助,请查看日志: $LOG_FILE" +} + +# ==================== 功能模块 ==================== + +# 机器码修改器 +modify_machine_code() { + log "INFO" "🛠️ 开始修改机器码配置..." + + # 检查配置文件 + if [ ! -f "$STORAGE_FILE" ]; then + log "ERROR" "❌ 配置文件不存在,请先启动Cursor生成配置" + return 1 + fi + + # 创建备份 + mkdir -p "$BACKUP_DIR" + local backup_file="$BACKUP_DIR/storage.json.backup_$(date +%Y%m%d_%H%M%S)" + cp "$STORAGE_FILE" "$backup_file" || { + log "ERROR" "❌ 备份失败" + return 1 + } + + # 生成新ID + local machine_id="auth0|user_$(openssl rand -hex 16)" + local mac_machine_id=$(uuidgen | tr '[:upper:]' '[:lower:]') + local device_id=$(uuidgen | tr '[:upper:]' '[:lower:]') + local sqm_id="{$(uuidgen | tr '[:lower:]' '[:upper:]')}" + + # 修改配置文件 + local python_result=$(python3 -c " +import json +import sys + +try: + with open('$STORAGE_FILE', 'r', encoding='utf-8') as f: + config = json.load(f) + + config['telemetry.machineId'] = '$machine_id' + config['telemetry.macMachineId'] = '$mac_machine_id' + config['telemetry.devDeviceId'] = '$device_id' + config['telemetry.sqmId'] = '$sqm_id' + + with open('$STORAGE_FILE', 'w', encoding='utf-8') as f: + json.dump(config, f, indent=2, ensure_ascii=False) + + print('SUCCESS') +except Exception as e: + print(f'ERROR: {e}') + sys.exit(1) +" 2>&1) + + if echo "$python_result" | grep -q "SUCCESS"; then + # 设置只读保护 + chmod 444 "$STORAGE_FILE" 2>/dev/null || true + log "INFO" "✅ 机器码修改成功" + log "INFO" "💾 备份保存至: $(basename "$backup_file")" + return 0 + else + log "ERROR" "❌ 机器码修改失败: $python_result" + cp "$backup_file" "$STORAGE_FILE" 2>/dev/null || true + return 1 + fi +} + +# 智能设备绕过器 - 根据环境自动选择最佳方案 +bypass_device_detection() { + log "INFO" "🔧 开始智能设备识别绕过..." + + # 根据环境兼容性选择方案 + if [ "$MAC_COMPATIBLE" = false ]; then + log "INFO" "💡 检测到MAC地址修改受限,使用JS内核修改方案" + return modify_js_kernel + else + log "INFO" "💡 尝试MAC地址修改方案" + if modify_mac_address; then + return 0 + else + log "WARN" "⚠️ MAC地址修改失败,切换到JS内核修改" + return modify_js_kernel + fi + fi +} + +# MAC地址修改器(简化版) +modify_mac_address() { + log "INFO" "🌐 开始MAC地址修改..." + + # 获取活动网络接口 + local interfaces=() + while IFS= read -r line; do + if [[ $line == "Hardware Port: Wi-Fi" || $line == "Hardware Port: Ethernet" ]]; then + read -r dev_line + local device=$(echo "$dev_line" | awk '{print $2}') + if [ -n "$device" ] && ifconfig "$device" 2>/dev/null | grep -q "status: active"; then + interfaces+=("$device") + fi + fi + done < <(networksetup -listallhardwareports) + + if [ ${#interfaces[@]} -eq 0 ]; then + log "WARN" "⚠️ 未找到活动网络接口" + return 1 + fi + + local success_count=0 + for interface in "${interfaces[@]}"; do + log "INFO" "🔧 处理接口: $interface" + + # 生成新MAC地址 + local new_mac=$(printf '%02x:%02x:%02x:%02x:%02x:%02x' \ + $(( (RANDOM & 0xFC) | 0x02 )) $((RANDOM%256)) $((RANDOM%256)) \ + $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256))) + + # 尝试修改MAC地址 + if sudo ifconfig "$interface" down 2>/dev/null && \ + sleep 2 && \ + sudo ifconfig "$interface" ether "$new_mac" 2>/dev/null && \ + sudo ifconfig "$interface" up 2>/dev/null; then + log "INFO" "✅ 接口 $interface MAC地址修改成功: $new_mac" + ((success_count++)) + else + log "WARN" "⚠️ 接口 $interface MAC地址修改失败" + fi + sleep 2 + done + + if [ $success_count -gt 0 ]; then + log "INFO" "✅ MAC地址修改完成 ($success_count/${#interfaces[@]} 成功)" + return 0 + else + return 1 + fi +} + +# JS内核修改器(简化版) +modify_js_kernel() { + log "INFO" "🔧 开始JS内核修改..." + + # 关闭Cursor + manage_cursor_process "kill" + + # 目标JS文件 + local js_files=( + "$CURSOR_APP_PATH/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js" + "$CURSOR_APP_PATH/Contents/Resources/app/out/main.js" + ) + + # 检查是否需要修改 + local need_modify=false + for file in "${js_files[@]}"; do + if [ -f "$file" ] && ! grep -q "return crypto.randomUUID()" "$file" 2>/dev/null; then + need_modify=true + break + fi + done + + if [ "$need_modify" = false ]; then + log "INFO" "✅ JS文件已修改,跳过" + return 0 + fi + + # 创建备份 + local backup_app="/tmp/Cursor.app.backup_$(date +%Y%m%d_%H%M%S)" + cp -R "$CURSOR_APP_PATH" "$backup_app" || { + log "ERROR" "❌ 创建备份失败" + return 1 + fi + + # 生成设备ID + local new_uuid=$(uuidgen | tr '[:upper:]' '[:lower:]') + local machine_id="auth0|user_$(openssl rand -hex 16)" + + # 修改JS文件 + local modified_count=0 + for file in "${js_files[@]}"; do + if [ ! -f "$file" ]; then + continue + fi + + log "INFO" "📝 处理文件: $(basename "$file")" + + # 创建注入代码 + local inject_code=" +// Cursor设备标识符劫持 - $(date +%Y%m%d%H%M%S) +import crypto from 'crypto'; +const originalRandomUUID = crypto.randomUUID; +crypto.randomUUID = function() { return '$new_uuid'; }; +globalThis.getMachineId = function() { return '$machine_id'; }; +console.log('Cursor设备标识符已劫持'); +" + + # 注入代码 + echo "$inject_code" > "${file}.new" + cat "$file" >> "${file}.new" + mv "${file}.new" "$file" + + ((modified_count++)) + log "INFO" "✅ 文件修改成功: $(basename "$file")" + done + + if [ $modified_count -gt 0 ]; then + # 重新签名 + if codesign --sign - --force --deep "$CURSOR_APP_PATH" 2>/dev/null; then + log "INFO" "✅ JS内核修改完成 ($modified_count 个文件)" + return 0 + else + log "WARN" "⚠️ 签名失败,但修改已完成" + return 0 + fi + else + log "ERROR" "❌ 未修改任何文件" + return 1 + fi +} + +# 环境重置器 +reset_environment() { + log "INFO" "🗑️ 开始环境重置..." + + # 关闭Cursor + manage_cursor_process "kill" + + # 删除目标文件夹 + local folders=( + "$HOME/Library/Application Support/Cursor" + "$HOME/.cursor" + ) + + local deleted_count=0 + for folder in "${folders[@]}"; do + if [ -d "$folder" ]; then + if rm -rf "$folder"; then + log "INFO" "✅ 已删除: $folder" + ((deleted_count++)) + else + log "ERROR" "❌ 删除失败: $folder" + fi + fi + done + + # 修复权限 + fix_permissions + + log "INFO" "✅ 环境重置完成 (删除 $deleted_count 个文件夹)" + return 0 +} + +# 禁用自动更新 +disable_auto_update() { + log "INFO" "🚫 禁用自动更新..." + + local app_update_yml="$CURSOR_APP_PATH/Contents/Resources/app-update.yml" + local updater_path="$HOME/Library/Application Support/Caches/cursor-updater" + + # 禁用app-update.yml + if [ -f "$app_update_yml" ]; then + sudo cp "$app_update_yml" "${app_update_yml}.bak" 2>/dev/null || true + sudo bash -c "echo '' > \"$app_update_yml\"" 2>/dev/null || true + sudo chmod 444 "$app_update_yml" 2>/dev/null || true + fi + + # 禁用cursor-updater + sudo rm -rf "$updater_path" 2>/dev/null || true + sudo touch "$updater_path" 2>/dev/null || true + sudo chmod 444 "$updater_path" 2>/dev/null || true + + log "INFO" "✅ 自动更新已禁用" +} + +# 修复应用签名问题 +fix_app_signature() { + log "INFO" "🔧 修复应用签名..." + + # 移除隔离属性 + sudo find "$CURSOR_APP_PATH" -print0 2>/dev/null | \ + xargs -0 sudo xattr -d com.apple.quarantine 2>/dev/null || true + + # 重新签名 + sudo codesign --force --deep --sign - "$CURSOR_APP_PATH" 2>/dev/null || true + + log "INFO" "✅ 应用签名修复完成" +} + +# ==================== 主执行流程 ==================== + +# 快速模式 - 仅修改机器码 +quick_mode() { + log "INFO" "🚀 执行快速模式(仅修改机器码)..." + + # 检查环境 + if ! detect_environment; then + handle_error "环境检测失败" "exit 1" + return 1 + fi + + # 预修复权限 + fix_permissions + + # 修改机器码 + if ! modify_machine_code; then + handle_error "机器码修改失败" "exit 1" + return 1 + fi + + # 设备绕过 + bypass_device_detection || log "WARN" "⚠️ 设备绕过失败,但机器码修改已完成" + + # 禁用更新 + disable_auto_update + + # 修复签名 + fix_app_signature + + # 最终权限修复 + fix_permissions + + log "INFO" "🎉 快速模式执行完成!" + return 0 +} + +# 完整模式 - 重置环境+修改机器码 +full_mode() { + log "INFO" "🚀 执行完整模式(重置环境+修改机器码)..." + + # 检查环境 + if ! detect_environment; then + handle_error "环境检测失败" "exit 1" + return 1 + fi + + # 环境重置 + if ! reset_environment; then + handle_error "环境重置失败" "exit 1" + return 1 + fi + + # 启动Cursor生成配置 + manage_cursor_process "start" + + # 等待配置文件生成 + local config_wait=0 + while [ ! -f "$STORAGE_FILE" ] && [ $config_wait -lt 30 ]; do + sleep 2 + ((config_wait += 2)) + log "INFO" "⏳ 等待配置文件生成... ($config_wait/30秒)" + done + + # 关闭Cursor + manage_cursor_process "kill" + + # 修改机器码 + if ! modify_machine_code; then + handle_error "机器码修改失败" "exit 1" + return 1 + fi + + # 设备绕过 + bypass_device_detection || log "WARN" "⚠️ 设备绕过失败,但机器码修改已完成" + + # 禁用更新 + disable_auto_update + + # 修复签名 + fix_app_signature + + # 最终权限修复 + fix_permissions + + log "INFO" "🎉 完整模式执行完成!" + return 0 +} + +# ==================== 用户界面 ==================== + +# 显示Logo和信息 +show_header() { + clear + echo -e " + ██████╗██╗ ██╗██████╗ ███████╗ ██████╗ ██████╗ + ██╔════╝██║ ██║██╔══██╗██╔════╝██╔═══██╗██╔══██╗ + ██║ ██║ ██║██████╔╝███████╗██║ ██║██████╔╝ + ██║ ██║ ██║██╔══██╗╚════██║██║ ██║██╔══██╗ + ╚██████╗╚██████╔╝██║ ██║███████║╚██████╔╝██║ ██║ + ╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝ + " + echo -e "${BLUE}================================${NC}" + echo -e "${GREEN}🚀 Cursor 机器码修改工具 (重构版) ${NC}" + echo -e "${YELLOW}📱 关注公众号【煎饼果子卷AI】 ${NC}" + echo -e "${BLUE}================================${NC}" + echo + echo -e "${YELLOW}💡 [免费工具]${NC} 如果对您有帮助,请关注公众号支持开发者" + echo +} + +# 用户选择菜单 +user_menu() { + echo -e "${GREEN}🎯 [选择模式]${NC} 请选择执行模式:" + echo + echo -e "${BLUE} 1️⃣ 快速模式 - 仅修改机器码${NC}" + echo -e "${YELLOW} • 保留现有配置和数据${NC}" + echo -e "${YELLOW} • 执行时间约30秒${NC}" + echo -e "${YELLOW} • 自动权限修复${NC}" + echo + echo -e "${BLUE} 2️⃣ 完整模式 - 重置环境+修改机器码${NC}" + echo -e "${RED} • 删除所有Cursor配置(请备份)${NC}" + echo -e "${YELLOW} • 执行时间约90秒${NC}" + echo -e "${YELLOW} • 彻底重置试用状态${NC}" + echo + + while true; do + read -p "请输入选择 (1 或 2): " choice + case "$choice" in + 1) + log "INFO" "✅ 用户选择:快速模式" + return 1 + ;; + 2) + echo -e "${RED}⚠️ [警告]${NC} 完整模式将删除所有Cursor配置!" + read -p "确认执行?(输入 yes 确认): " confirm + if [ "$confirm" = "yes" ]; then + log "INFO" "✅ 用户选择:完整模式" + return 2 + else + echo -e "${YELLOW}👋 [取消]${NC} 请重新选择" + continue + fi + ;; + *) + echo -e "${RED}❌ [错误]${NC} 无效选择,请输入 1 或 2" + ;; + esac + done +} + +# 显示完成信息 +show_completion() { + echo + echo -e "${GREEN}================================${NC}" + echo -e "${BLUE} 🎯 执行完成总结 ${NC}" + echo -e "${GREEN}================================${NC}" + echo -e "${GREEN}✅ 机器码配置: 已修改${NC}" + echo -e "${GREEN}✅ 设备识别绕过: 已完成${NC}" + echo -e "${GREEN}✅ 自动更新: 已禁用${NC}" + echo -e "${GREEN}✅ 权限修复: 已完成${NC}" + echo -e "${GREEN}✅ 应用签名: 已修复${NC}" + echo -e "${GREEN}================================${NC}" + echo + echo -e "${YELLOW}📱 关注公众号【煎饼果子卷AI】获取更多Cursor技巧${NC}" + echo + echo -e "${BLUE}🚀 [下一步]${NC} 现在可以启动Cursor使用了!" + echo -e "${BLUE}📄 [日志]${NC} 详细日志保存在: $LOG_FILE" + echo +} + +# ==================== 主函数 ==================== + +main() { + # 检查权限 + if [ "$EUID" -ne 0 ]; then + echo -e "${RED}❌ [错误]${NC} 请使用 sudo 运行此脚本" + echo "示例: sudo $0" + exit 1 + fi + + # 检查macOS + if [[ $(uname) != "Darwin" ]]; then + echo -e "${RED}❌ [错误]${NC} 本脚本仅支持 macOS 系统" + exit 1 + fi + + # 初始化 + init_log + log "INFO" "🚀 Cursor重构脚本启动..." + + # 预修复权限 + fix_permissions + + # 显示界面 + show_header + + # 用户选择 + user_menu + local mode=$? + + echo + log "INFO" "🚀 开始执行,请稍候..." + echo + + # 执行对应模式 + case $mode in + 1) + if quick_mode; then + show_completion + exit 0 + else + log "ERROR" "❌ 快速模式执行失败" + exit 1 + fi + ;; + 2) + if full_mode; then + show_completion + exit 0 + else + log "ERROR" "❌ 完整模式执行失败" + exit 1 + fi + ;; + esac +} + +# 执行主函数 +main "$@"