From 421e7fd2daf8514fe154a441a5acab388da7dd43 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=85=8E=E9=A5=BC=E6=9E=9C=E5=AD=90=E5=8D=B7=E9=B2=A8?= =?UTF-8?q?=E9=B1=BC=E8=BE=A3=E6=A4=92?= Date: Wed, 9 Jul 2025 16:32:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96Apple=20Silicon=E7=8E=AF?= =?UTF-8?q?=E5=A2=83=E4=B8=8B=E7=9A=84MAC=E5=9C=B0=E5=9D=80=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E9=80=BB=E8=BE=91=EF=BC=8C=E6=96=B0=E5=A2=9E=E5=AE=8C?= =?UTF-8?q?=E5=85=A8=E8=87=AA=E5=8A=A8=E5=8C=96=E6=A8=A1=E5=BC=8F=EF=BC=8C?= =?UTF-8?q?=E6=97=A0=E9=9C=80=E7=94=A8=E6=88=B7=E7=A1=AE=E8=AE=A4=E3=80=82?= =?UTF-8?q?=E6=94=B9=E8=BF=9B=E7=94=A8=E6=88=B7=E4=BA=A4=E4=BA=92=EF=BC=8C?= =?UTF-8?q?=E7=A1=AE=E4=BF=9D=E5=9C=A8MAC=E5=9C=B0=E5=9D=80=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E5=A4=B1=E8=B4=A5=E6=97=B6=E8=87=AA=E5=8A=A8=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E5=88=B0JS=E5=86=85=E6=A0=B8=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E6=96=B9=E6=A1=88=EF=BC=8C=E5=87=8F=E5=B0=91=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E5=B9=B2=E9=A2=84=E3=80=82=E5=A2=9E=E5=BC=BACursor=E7=9B=AE?= =?UTF-8?q?=E5=BD=95=E6=9D=83=E9=99=90=E7=AE=A1=E7=90=86=EF=BC=8C=E7=A1=AE?= =?UTF-8?q?=E4=BF=9D=E5=90=AF=E5=8A=A8=E5=89=8D=E6=9D=83=E9=99=90=E6=AD=A3?= =?UTF-8?q?=E7=A1=AE=EF=BC=8C=E6=8F=90=E5=8D=87=E8=84=9A=E6=9C=AC=E7=9A=84?= =?UTF-8?q?=E5=AE=89=E5=85=A8=E6=80=A7=E5=92=8C=E7=94=A8=E6=88=B7=E4=BD=93?= =?UTF-8?q?=E9=AA=8C=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/docs/apple_silicon_mac_solution.md | 27 +- .../docs/cursor_permission_fix_complete.md | 178 ++++++++++ scripts/fix/cursor_permission_fix.sh | 262 +++++++++++++++ scripts/run/cursor_mac_id_modifier.sh | 305 ++++++++++++++---- 4 files changed, 694 insertions(+), 78 deletions(-) create mode 100644 scripts/docs/cursor_permission_fix_complete.md create mode 100644 scripts/fix/cursor_permission_fix.sh diff --git a/scripts/docs/apple_silicon_mac_solution.md b/scripts/docs/apple_silicon_mac_solution.md index 6bd92e2..6263b26 100644 --- a/scripts/docs/apple_silicon_mac_solution.md +++ b/scripts/docs/apple_silicon_mac_solution.md @@ -59,18 +59,22 @@ global.macMachineId = 'random-mac-machine-id'; ### 智能检测逻辑 ```bash if [[ "$HARDWARE_TYPE" == "Apple Silicon" ]]; then - # 自动切换到JS内核修改 + # 自动切换到JS内核修改(无需用户确认) modify_cursor_js_files + return 0 else # 传统MAC地址修改 - change_system_mac_address + if ! change_system_mac_address; then + # 失败时自动切换到JS内核修改(无需用户确认) + modify_cursor_js_files + fi fi ``` ### 用户交互优化 -- Apple Silicon环境自动提示JS方案 -- MAC地址修改失败时提供JS备选 -- 清晰的方案说明和效果对比 +- **Apple Silicon环境完全自动化** - 直接使用JS方案,无需确认 +- **MAC地址修改失败自动切换** - 无需用户选择,直接尝试JS方案 +- **最小化用户交互** - 智能决策,减少不必要的确认步骤 ## 💡 方案优势 @@ -108,17 +112,20 @@ fi ## 📋 使用指南 -### 自动模式(推荐) +### 完全自动化模式(推荐) ```bash sudo ./cursor_mac_id_modifier.sh # 选择"重置环境+修改机器码" # 脚本会自动检测环境并选择最佳方案 +# Apple Silicon环境自动使用JS内核修改 +# MAC地址修改失败自动切换到JS方案 ``` -### 手动选择 -- MAC地址修改失败时,脚本会提供JS修改选项 -- 用户可以根据提示选择合适的方案 -- 支持重试和备选方案切换 +### 智能决策流程 +- **Apple Silicon检测** - 自动使用JS内核修改,无需确认 +- **MAC地址修改失败** - 自动切换到JS方案,无需用户选择 +- **最小化交互** - 只在必要时询问用户(如重试失败的接口) +- **智能备选** - 双重保障确保设备识别绕过成功 ## 🛡️ 安全考虑 diff --git a/scripts/docs/cursor_permission_fix_complete.md b/scripts/docs/cursor_permission_fix_complete.md new file mode 100644 index 0000000..df05e7b --- /dev/null +++ b/scripts/docs/cursor_permission_fix_complete.md @@ -0,0 +1,178 @@ +# macOS Cursor权限问题完整修复方案 + +## 🚨 问题描述 + +用户在macOS系统上运行修复后的Cursor脚本时,仍然遇到权限错误: +``` +EACCES: permission denied, mkdir '/Users/chaoqun/Library/Application Support/Cursor/logs/20250709T152940' +``` + +## 🔍 问题根本原因分析 + +### **权限问题的深层原因** +1. **时机问题** - 权限修复在Cursor启动后被覆盖 +2. **深度不够** - 原有权限修复没有覆盖所有必要的子目录 +3. **logs目录特殊性** - Cursor启动时会动态创建带时间戳的logs子目录 +4. **系统级权限策略** - macOS对Application Support目录有特殊的权限管理 + +### **错误发生时机** +- 错误发生在**Cursor启动时**,而不是脚本执行过程中 +- Cursor尝试创建`logs/20250709T152940`这样的时间戳目录时失败 +- 说明父目录权限可能正确,但子目录创建权限不足 + +## 🔧 完整修复方案 + +### **1. 增强的权限修复函数** + +#### **原有函数升级** +- `ensure_cursor_directory_permissions()` - 增强为深度权限修复 +- 新增扩展目录列表,包含所有可能的子目录 +- 添加权限诊断和验证机制 +- 使用sudo进行深度权限修复 + +#### **新增专用函数** +- `ensure_cursor_startup_permissions()` - Cursor启动前权限最终确保 +- 专门处理logs目录权限问题 +- 删除并重新创建logs目录以确保权限正确 +- 实时测试目录创建权限 + +### **2. 权限修复集成点** + +#### **关键执行节点** +1. **Cursor启动前** - 在所有Cursor启动点调用`ensure_cursor_startup_permissions()` +2. **配置文件生成后** - 调用`ensure_cursor_directory_permissions()` +3. **机器码修改完成后** - 双重权限确保 + +#### **具体集成位置** +```bash +# 位置1: restart_cursor_and_wait函数中 +ensure_cursor_startup_permissions +"$CURSOR_PROCESS_PATH" > /dev/null 2>&1 & + +# 位置2: start_cursor_to_generate_config函数中 +ensure_cursor_startup_permissions +"$cursor_executable" > /dev/null 2>&1 & + +# 位置3: 机器码修改完成后 +ensure_cursor_directory_permissions +ensure_cursor_startup_permissions +``` + +### **3. 专用权限修复脚本** + +#### **独立修复工具** +- `scripts/fix/cursor_permission_fix.sh` - 专用权限修复脚本 +- 可以独立运行,专门解决权限问题 +- 包含完整的权限诊断和强制修复功能 + +#### **修复脚本功能** +1. **权限诊断** - 详细检查所有目录权限状态 +2. **问题识别** - 特别检查logs目录创建权限 +3. **强制修复** - 删除并重新创建完整目录结构 +4. **配置备份** - 自动备份和恢复重要配置文件 +5. **修复验证** - 测试修复效果 + +## 🎯 修复机制详解 + +### **深度权限修复流程** +``` +1. 权限诊断 → 识别问题目录 +2. 强制修复 → 使用sudo确保所有权 +3. 目录重建 → 删除并重新创建问题目录 +4. 权限设置 → 755目录权限 + 用户所有权 +5. 特殊处理 → logs目录专门处理 +6. 实时测试 → 验证目录创建权限 +7. 最终验证 → 确保所有目录可写 +``` + +### **logs目录特殊处理** +```bash +# 删除并重新创建logs目录 +sudo rm -rf "$logs_dir" +sudo mkdir -p "$logs_dir" +sudo chown "$current_user:staff" "$logs_dir" +sudo chmod 755 "$logs_dir" + +# 测试子目录创建权限 +test_subdir="$logs_dir/test_$(date +%s)" +mkdir -p "$test_subdir" # 测试是否能创建子目录 +``` + +### **权限设置策略** +- **目录权限**: 755 (用户可读写执行,组和其他用户可读执行) +- **文件权限**: 644 (用户可读写,组和其他用户可读) +- **所有权**: `用户:staff` (确保当前用户拥有完全控制权) +- **递归设置**: 使用`-R`参数确保所有子目录权限正确 + +## 🚀 使用方法 + +### **自动修复(推荐)** +```bash +# 运行主脚本,权限修复已集成 +sudo ./scripts/run/cursor_mac_id_modifier.sh +``` + +### **独立权限修复** +```bash +# 如果仍有权限问题,运行专用修复脚本 +sudo ./scripts/fix/cursor_permission_fix.sh +``` + +### **手动修复(备选)** +```bash +# 如果脚本修复失败,手动执行 +sudo rm -rf "$HOME/Library/Application Support/Cursor" +sudo rm -rf "$HOME/.cursor" +sudo mkdir -p "$HOME/Library/Application Support/Cursor/logs" +sudo mkdir -p "$HOME/.cursor/extensions" +sudo chown -R $(whoami):staff "$HOME/Library/Application Support/Cursor" +sudo chown -R $(whoami):staff "$HOME/.cursor" +sudo chmod -R 755 "$HOME/Library/Application Support/Cursor" +sudo chmod -R 755 "$HOME/.cursor" +``` + +## 📋 修复验证 + +### **验证步骤** +1. **运行权限测试脚本** - `scripts/test/test_cursor_permissions.sh` +2. **启动Cursor应用** - 检查是否还有权限错误 +3. **查看logs目录** - 确认能正常创建时间戳子目录 +4. **运行主脚本** - 验证完整流程是否正常 + +### **成功指标** +- ✅ 所有目录权限检查通过 +- ✅ logs目录可以创建子目录 +- ✅ Cursor启动无权限错误 +- ✅ 脚本执行完整流程成功 + +## 🛡️ 预防措施 + +### **权限保护机制** +1. **多点权限确保** - 在关键节点多次确保权限 +2. **实时权限测试** - 每次修复后立即测试 +3. **备份恢复机制** - 自动备份重要配置文件 +4. **错误处理** - 权限修复失败时提供手动修复指导 + +### **长期稳定性** +- 权限修复使用系统标准权限设置 +- 避免过度权限,确保系统安全 +- 兼容macOS系统更新和Cursor应用更新 + +## 🎉 预期效果 + +修复完成后应该彻底解决: +- ❌ `EACCES: permission denied, mkdir` 错误 +- ❌ Cursor启动时权限问题 +- ❌ logs目录创建失败问题 +- ❌ 脚本执行中断问题 + +现在用户可以在macOS环境下正常使用Cursor试用重置功能,不再受权限问题困扰! + +## 📞 故障排除 + +如果问题仍然存在: +1. **检查macOS版本** - 确保兼容性 +2. **检查用户权限** - 确保有sudo权限 +3. **检查磁盘空间** - 确保有足够空间 +4. **重启系统** - 清除可能的权限缓存 +5. **联系支持** - 提供详细的错误日志 diff --git a/scripts/fix/cursor_permission_fix.sh b/scripts/fix/cursor_permission_fix.sh new file mode 100644 index 0000000..aabe25f --- /dev/null +++ b/scripts/fix/cursor_permission_fix.sh @@ -0,0 +1,262 @@ +#!/bin/bash + +# Cursor权限问题专用修复脚本 +# 专门解决macOS环境下Cursor权限错误问题 +# 错误类型:EACCES: permission denied, mkdir '/Users/xxx/Library/Application Support/Cursor/logs/xxx' + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# 日志函数 +log_info() { + echo -e "${GREEN}[INFO]${NC} $1" +} + +log_warn() { + echo -e "${YELLOW}[WARN]${NC} $1" +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# 获取当前用户信息 +CURRENT_USER=$(whoami) +CURSOR_SUPPORT_DIR="$HOME/Library/Application Support/Cursor" +CURSOR_HOME_DIR="$HOME/.cursor" + +# 权限诊断函数 +diagnose_permissions() { + echo + log_info "🔍 [诊断] 开始权限诊断..." + + # 检查目录列表 + 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" + ) + + local issues_found=false + + echo + echo "📋 [权限状态] 当前权限状态:" + echo "----------------------------------------" + + for dir in "${directories[@]}"; do + if [ -d "$dir" ]; then + local perms=$(ls -ld "$dir" | awk '{print $1}') + local owner=$(ls -ld "$dir" | awk '{print $3}') + local group=$(ls -ld "$dir" | awk '{print $4}') + + if [ "$owner" = "$CURRENT_USER" ] && [ -w "$dir" ]; then + echo -e "✅ $dir" + echo -e " 权限: $perms | 所有者: $owner:$group | 状态: 正常" + else + echo -e "❌ $dir" + echo -e " 权限: $perms | 所有者: $owner:$group | 状态: 异常" + issues_found=true + fi + else + echo -e "❌ $dir (不存在)" + issues_found=true + fi + echo + done + + # 特别检查logs目录 + local logs_dir="$CURSOR_SUPPORT_DIR/logs" + echo "🎯 [logs目录] 特别检查logs目录:" + echo "----------------------------------------" + + if [ -d "$logs_dir" ]; then + # 测试创建子目录 + local test_subdir="$logs_dir/test_$(date +%s)" + if mkdir -p "$test_subdir" 2>/dev/null; then + echo -e "✅ logs目录可以创建子目录" + rmdir "$test_subdir" 2>/dev/null || true + else + echo -e "❌ logs目录无法创建子目录 - 这是问题根源!" + issues_found=true + fi + else + echo -e "❌ logs目录不存在" + issues_found=true + fi + + echo + if [ "$issues_found" = true ]; then + log_error "❌ [诊断结果] 发现权限问题" + return 1 + else + log_info "✅ [诊断结果] 权限状态正常" + return 0 + fi +} + +# 强制权限修复函数 +force_fix_permissions() { + echo + log_info "🔧 [强制修复] 开始强制权限修复..." + + # 关闭所有Cursor进程 + log_info "🔄 [关闭进程] 关闭所有Cursor进程..." + pkill -f "Cursor" 2>/dev/null || true + sleep 2 + + # 完全删除并重新创建目录结构 + log_info "🗑️ [重建] 删除并重新创建目录结构..." + + # 备份重要文件 + local backup_dir="/tmp/cursor_backup_$(date +%s)" + if [ -d "$CURSOR_SUPPORT_DIR/User/globalStorage" ]; then + log_info "💾 [备份] 备份配置文件..." + mkdir -p "$backup_dir" + cp -R "$CURSOR_SUPPORT_DIR/User/globalStorage" "$backup_dir/" 2>/dev/null || true + fi + + # 删除目录 + sudo rm -rf "$CURSOR_SUPPORT_DIR" 2>/dev/null || true + sudo rm -rf "$CURSOR_HOME_DIR" 2>/dev/null || true + + # 重新创建目录结构 + log_info "📁 [创建] 重新创建目录结构..." + local directories=( + "$CURSOR_SUPPORT_DIR" + "$CURSOR_SUPPORT_DIR/User" + "$CURSOR_SUPPORT_DIR/User/globalStorage" + "$CURSOR_SUPPORT_DIR/User/globalStorage/backups" + "$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_SUPPORT_DIR/User/snippets" + "$CURSOR_SUPPORT_DIR/User/keybindings" + "$CURSOR_SUPPORT_DIR/crashDumps" + "$CURSOR_HOME_DIR" + "$CURSOR_HOME_DIR/extensions" + ) + + for dir in "${directories[@]}"; do + sudo mkdir -p "$dir" 2>/dev/null || true + sudo chown "$CURRENT_USER:staff" "$dir" 2>/dev/null || true + sudo chmod 755 "$dir" 2>/dev/null || true + done + + # 恢复备份的配置文件 + if [ -d "$backup_dir/globalStorage" ]; then + log_info "🔄 [恢复] 恢复配置文件..." + cp -R "$backup_dir/globalStorage"/* "$CURSOR_SUPPORT_DIR/User/globalStorage/" 2>/dev/null || true + sudo chown -R "$CURRENT_USER:staff" "$CURSOR_SUPPORT_DIR/User/globalStorage" 2>/dev/null || true + sudo chmod -R 644 "$CURSOR_SUPPORT_DIR/User/globalStorage"/*.json 2>/dev/null || true + fi + + # 设置最终权限 + log_info "🔐 [权限] 设置最终权限..." + sudo chown -R "$CURRENT_USER:staff" "$CURSOR_SUPPORT_DIR" 2>/dev/null || true + sudo chown -R "$CURRENT_USER:staff" "$CURSOR_HOME_DIR" 2>/dev/null || true + sudo chmod -R 755 "$CURSOR_SUPPORT_DIR" 2>/dev/null || true + sudo chmod -R 755 "$CURSOR_HOME_DIR" 2>/dev/null || true + + # 特别确保logs目录权限 + log_info "🎯 [logs] 特别确保logs目录权限..." + sudo chown "$CURRENT_USER:staff" "$CURSOR_SUPPORT_DIR/logs" 2>/dev/null || true + sudo chmod 755 "$CURSOR_SUPPORT_DIR/logs" 2>/dev/null || true + + # 测试修复效果 + local test_subdir="$CURSOR_SUPPORT_DIR/logs/test_$(date +%s)" + if mkdir -p "$test_subdir" 2>/dev/null; then + log_info "✅ [测试] logs目录权限修复成功" + rmdir "$test_subdir" 2>/dev/null || true + else + log_error "❌ [测试] logs目录权限修复失败" + return 1 + fi + + log_info "✅ [完成] 强制权限修复完成" + + # 清理备份 + rm -rf "$backup_dir" 2>/dev/null || true + + return 0 +} + +# 主函数 +main() { + echo -e "${GREEN}========================================${NC}" + echo -e "${GREEN} Cursor权限问题专用修复脚本${NC}" + echo -e "${GREEN}========================================${NC}" + echo + echo -e "${BLUE}🎯 [目标]${NC} 解决Cursor权限错误:" + echo -e "${BLUE} EACCES: permission denied, mkdir${NC}" + echo -e "${BLUE} '/Users/xxx/Library/Application Support/Cursor/logs/xxx'${NC}" + echo + + # 检查是否为macOS + if [[ "$OSTYPE" != "darwin"* ]]; then + log_error "❌ [错误] 此脚本仅适用于macOS系统" + exit 1 + fi + + # 检查sudo权限 + if ! sudo -n true 2>/dev/null; then + log_info "🔑 [权限] 此脚本需要sudo权限来修复目录权限" + echo "请输入您的密码:" + sudo -v + fi + + # 执行诊断 + if diagnose_permissions; then + echo + log_info "🎉 [结果] 权限状态正常,无需修复" + echo + echo -e "${BLUE}💡 [建议]${NC} 如果Cursor仍有权限错误,请:" + echo -e "${BLUE} 1. 重启Cursor应用${NC}" + echo -e "${BLUE} 2. 重启macOS系统${NC}" + echo -e "${BLUE} 3. 如果问题持续,请运行强制修复${NC}" + else + echo + log_warn "⚠️ [发现问题] 检测到权限问题,开始修复..." + + if force_fix_permissions; then + echo + log_info "🎉 [成功] 权限修复完成!" + echo + echo -e "${GREEN}✅ [下一步]${NC} 现在可以:" + echo -e "${GREEN} 1. 启动Cursor应用${NC}" + echo -e "${GREEN} 2. 运行Cursor脚本${NC}" + echo -e "${GREEN} 3. 权限错误应该已经解决${NC}" + else + echo + log_error "❌ [失败] 权限修复失败" + echo + echo -e "${RED}💡 [手动修复]${NC} 请手动执行以下命令:" + echo -e "${RED}sudo rm -rf \"$CURSOR_SUPPORT_DIR\"${NC}" + echo -e "${RED}sudo rm -rf \"$CURSOR_HOME_DIR\"${NC}" + echo -e "${RED}sudo mkdir -p \"$CURSOR_SUPPORT_DIR/logs\"${NC}" + echo -e "${RED}sudo mkdir -p \"$CURSOR_HOME_DIR/extensions\"${NC}" + echo -e "${RED}sudo chown -R $CURRENT_USER:staff \"$CURSOR_SUPPORT_DIR\"${NC}" + echo -e "${RED}sudo chown -R $CURRENT_USER:staff \"$CURSOR_HOME_DIR\"${NC}" + echo -e "${RED}sudo chmod -R 755 \"$CURSOR_SUPPORT_DIR\"${NC}" + echo -e "${RED}sudo chmod -R 755 \"$CURSOR_HOME_DIR\"${NC}" + fi + fi + + echo + echo -e "${GREEN}========================================${NC}" + echo -e "${GREEN} 修复完成${NC}" + echo -e "${GREEN}========================================${NC}" +} + +# 执行主函数 +main "$@" diff --git a/scripts/run/cursor_mac_id_modifier.sh b/scripts/run/cursor_mac_id_modifier.sh index 9488153..6627e89 100644 --- a/scripts/run/cursor_mac_id_modifier.sh +++ b/scripts/run/cursor_mac_id_modifier.sh @@ -282,6 +282,9 @@ restart_cursor_and_wait() { chmod -R u+w "$HOME/Library/Application Support/Cursor" 2>/dev/null || true chmod -R u+w "$HOME/.cursor" 2>/dev/null || true + # 🚀 关键修复:Cursor启动前权限最终确保 + ensure_cursor_startup_permissions + # 启动Cursor log_info "🚀 [启动] 正在启动Cursor..." "$CURSOR_PROCESS_PATH" > /dev/null 2>&1 & @@ -402,6 +405,9 @@ start_cursor_to_generate_config() { log_info "📍 [路径] 使用Cursor路径: $cursor_executable" + # 🚀 关键修复:Cursor启动前权限最终确保 + ensure_cursor_startup_permissions + # 启动Cursor "$cursor_executable" > /dev/null 2>&1 & local cursor_pid=$! @@ -436,53 +442,243 @@ start_cursor_to_generate_config() { # �️ 确保Cursor目录权限正确(新增函数) ensure_cursor_directory_permissions() { - log_info "🛡️ [权限修复] 确保Cursor目录权限正确..." + log_info "🛡️ [增强权限修复] 开始深度权限修复和诊断..." local cursor_support_dir="$HOME/Library/Application Support/Cursor" local cursor_home_dir="$HOME/.cursor" + local current_user=$(whoami) - # 关键目录列表 + # 扩展的关键目录列表(包含所有可能的子目录) local directories=( "$cursor_support_dir" "$cursor_support_dir/User" "$cursor_support_dir/User/globalStorage" - "$cursor_support_dir/logs" - "$cursor_support_dir/CachedData" + "$cursor_support_dir/User/globalStorage/backups" "$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_support_dir/User/snippets" + "$cursor_support_dir/User/keybindings" + "$cursor_support_dir/crashDumps" "$cursor_home_dir" "$cursor_home_dir/extensions" ) - # 确保所有目录存在并有正确权限 + # 🔍 第一步:权限诊断 + log_info "🔍 [诊断] 执行权限诊断..." + local permission_issues=() + + for dir in "${directories[@]}"; do + if [ -d "$dir" ]; then + local owner=$(ls -ld "$dir" | awk '{print $3}') + local perms=$(ls -ld "$dir" | awk '{print $1}') + + if [ "$owner" != "$current_user" ]; then + permission_issues+=("所有权问题: $dir (当前所有者: $owner)") + fi + + if [ ! -w "$dir" ]; then + permission_issues+=("写入权限问题: $dir") + fi + fi + done + + if [ ${#permission_issues[@]} -gt 0 ]; then + log_warn "⚠️ [诊断] 发现 ${#permission_issues[@]} 个权限问题:" + for issue in "${permission_issues[@]}"; do + echo " ❌ $issue" + done + else + log_info "✅ [诊断] 现有目录权限检查通过" + fi + + # 🔧 第二步:强制权限修复 + log_info "🔧 [修复] 开始强制权限修复..." + + # 确保所有目录存在 + log_info "📁 [创建] 确保所有必要目录存在..." for dir in "${directories[@]}"; do if [ ! -d "$dir" ]; then - mkdir -p "$dir" 2>/dev/null || true + if mkdir -p "$dir" 2>/dev/null; then + log_info "✅ [创建] 成功创建目录: ${dir/$HOME/\~}" + else + log_warn "⚠️ [创建] 创建目录失败: ${dir/$HOME/\~}" + fi fi + done + + # 🔑 第三步:使用sudo进行深度权限修复 + log_info "🔑 [深度修复] 使用sudo进行深度权限修复..." + + # 修复主目录所有权 + if sudo chown -R "$current_user:staff" "$cursor_support_dir" 2>/dev/null; then + log_info "✅ [所有权] Application Support/Cursor目录所有权修复成功" + else + log_error "❌ [所有权] Application Support/Cursor目录所有权修复失败" + fi + + if sudo chown -R "$current_user:staff" "$cursor_home_dir" 2>/dev/null; then + log_info "✅ [所有权] .cursor目录所有权修复成功" + else + log_error "❌ [所有权] .cursor目录所有权修复失败" + fi + + # 设置递归权限 + log_info "🔐 [权限] 设置递归权限..." + if sudo chmod -R 755 "$cursor_support_dir" 2>/dev/null; then + log_info "✅ [权限] Application Support/Cursor目录权限设置成功" + else + log_warn "⚠️ [权限] Application Support/Cursor目录权限设置失败" + fi - # 设置目录权限:用户可读写执行,组和其他用户可读执行 - chmod 755 "$dir" 2>/dev/null || true - chown "$(whoami)" "$dir" 2>/dev/null || true + if sudo chmod -R 755 "$cursor_home_dir" 2>/dev/null; then + log_info "✅ [权限] .cursor目录权限设置成功" + else + log_warn "⚠️ [权限] .cursor目录权限设置失败" + fi + + # 🔓 第四步:确保用户写入权限 + log_info "🔓 [写入权限] 确保用户写入权限..." + if sudo chmod -R u+w "$cursor_support_dir" 2>/dev/null; then + log_info "✅ [写入] Application Support/Cursor写入权限设置成功" + else + log_warn "⚠️ [写入] Application Support/Cursor写入权限设置失败" + fi + + if sudo chmod -R u+w "$cursor_home_dir" 2>/dev/null; then + log_info "✅ [写入] .cursor写入权限设置成功" + else + log_warn "⚠️ [写入] .cursor写入权限设置失败" + fi + + # 🎯 第五步:特别处理logs目录 + log_info "🎯 [特殊处理] 特别处理logs目录权限..." + local logs_dir="$cursor_support_dir/logs" + + # 确保logs目录存在并有正确权限 + sudo mkdir -p "$logs_dir" 2>/dev/null || true + sudo chown -R "$current_user:staff" "$logs_dir" 2>/dev/null || true + sudo chmod -R 755 "$logs_dir" 2>/dev/null || true + + # 测试logs目录创建权限 + local test_log_dir="$logs_dir/test_$(date +%s)" + if mkdir -p "$test_log_dir" 2>/dev/null; then + log_info "✅ [测试] logs目录创建权限测试成功" + rmdir "$test_log_dir" 2>/dev/null || true + else + log_error "❌ [测试] logs目录创建权限测试失败" + + # 强制修复logs目录权限 + log_info "🔧 [强制修复] 强制修复logs目录权限..." + sudo rm -rf "$logs_dir" 2>/dev/null || true + sudo mkdir -p "$logs_dir" 2>/dev/null || true + sudo chown "$current_user:staff" "$logs_dir" 2>/dev/null || true + sudo chmod 755 "$logs_dir" 2>/dev/null || true + fi + + # 🔍 第六步:最终验证 + log_info "🔍 [最终验证] 执行最终权限验证..." + local final_issues=() + + for dir in "${directories[@]}"; do + if [ -d "$dir" ]; then + if [ ! -w "$dir" ]; then + final_issues+=("$dir") + fi + fi done - # 特别处理:使用sudo确保关键目录权限 - if sudo chown -R "$(whoami)" "$cursor_support_dir" 2>/dev/null; then - log_info "✅ [权限] Application Support/Cursor目录权限修复成功" + if [ ${#final_issues[@]} -eq 0 ]; then + log_info "✅ [验证成功] 所有目录权限验证通过" else - log_warn "⚠️ [权限] Application Support/Cursor目录权限修复失败" + log_error "❌ [验证失败] 以下目录仍有权限问题:" + for dir in "${final_issues[@]}"; do + echo " ❌ $dir" + done + + # 提供手动修复命令 + log_info "💡 [手动修复] 如果问题持续,请手动执行以下命令:" + echo "sudo chown -R $current_user:staff \"$cursor_support_dir\"" + echo "sudo chown -R $current_user:staff \"$cursor_home_dir\"" + echo "sudo chmod -R 755 \"$cursor_support_dir\"" + echo "sudo chmod -R 755 \"$cursor_home_dir\"" fi - if sudo chown -R "$(whoami)" "$cursor_home_dir" 2>/dev/null; then - log_info "✅ [权限] .cursor目录权限修复成功" + log_info "✅ [完成] 增强权限修复完成" +} + +# 🚀 Cursor启动前权限最终确保(新增函数) +ensure_cursor_startup_permissions() { + log_info "🚀 [启动前权限] 确保Cursor启动前权限正确..." + + local cursor_support_dir="$HOME/Library/Application Support/Cursor" + local cursor_home_dir="$HOME/.cursor" + local current_user=$(whoami) + + # 关键启动目录 + local startup_dirs=( + "$cursor_support_dir" + "$cursor_support_dir/logs" + "$cursor_support_dir/CachedData" + "$cursor_support_dir/User" + "$cursor_support_dir/User/globalStorage" + "$cursor_home_dir" + "$cursor_home_dir/extensions" + ) + + # 强制确保启动目录权限 + for dir in "${startup_dirs[@]}"; do + # 确保目录存在 + sudo mkdir -p "$dir" 2>/dev/null || true + + # 设置正确的所有权和权限 + sudo chown "$current_user:staff" "$dir" 2>/dev/null || true + sudo chmod 755 "$dir" 2>/dev/null || true + + # 验证权限 + if [ -w "$dir" ]; then + log_info "✅ [启动权限] $dir 权限正确" + else + log_warn "⚠️ [启动权限] $dir 权限异常,尝试强制修复..." + sudo chown -R "$current_user:staff" "$dir" 2>/dev/null || true + sudo chmod -R 755 "$dir" 2>/dev/null || true + fi + done + + # 特别处理logs目录 - 这是最容易出问题的地方 + local logs_dir="$cursor_support_dir/logs" + log_info "🎯 [logs目录] 特别确保logs目录权限..." + + # 删除并重新创建logs目录以确保权限正确 + sudo rm -rf "$logs_dir" 2>/dev/null || true + sudo mkdir -p "$logs_dir" 2>/dev/null || true + sudo chown "$current_user:staff" "$logs_dir" 2>/dev/null || true + sudo chmod 755 "$logs_dir" 2>/dev/null || true + + # 测试logs目录权限 + local test_file="$logs_dir/permission_test_$(date +%s).tmp" + if touch "$test_file" 2>/dev/null; then + log_info "✅ [logs测试] logs目录权限测试成功" + rm -f "$test_file" 2>/dev/null || true else - log_warn "⚠️ [权限] .cursor目录权限修复失败" + log_error "❌ [logs测试] logs目录权限测试失败" + + # 最后的强制修复尝试 + log_info "🔧 [最后修复] 执行最后的强制修复..." + sudo rm -rf "$cursor_support_dir" 2>/dev/null || true + sudo mkdir -p "$cursor_support_dir/logs" 2>/dev/null || true + sudo mkdir -p "$cursor_support_dir/User/globalStorage" 2>/dev/null || true + sudo chown -R "$current_user:staff" "$cursor_support_dir" 2>/dev/null || true + sudo chmod -R 755 "$cursor_support_dir" 2>/dev/null || true fi - # 设置用户写入权限 - chmod -R u+w "$cursor_support_dir" 2>/dev/null || true - chmod -R u+w "$cursor_home_dir" 2>/dev/null || true + log_info "✅ [启动前权限] Cursor启动前权限确保完成" +} - log_info "✅ [权限修复] Cursor目录权限修复完成" + log_info "✅ [启动前权限] Cursor启动前权限确保完成" } # �🛠️ 修改机器码配置(增强版) @@ -701,6 +897,9 @@ except Exception as e: # 🛡️ 关键修复:确保目录权限正确 ensure_cursor_directory_permissions + # 🚀 关键修复:确保Cursor启动前权限正确 + ensure_cursor_startup_permissions + echo log_info "🎉 [成功] 机器码配置修改完成!" log_info "📋 [详情] 已更新以下标识符:" @@ -921,12 +1120,12 @@ _change_mac_for_one_interface() { log_error "所有MAC地址修改方法都失败了" _show_troubleshooting_info "$interface_name" - # 🔧 失败时提供JS修改备选方案 + # 🔧 失败时提供选择:重试、跳过或退出 echo - echo -e "${BLUE}🔧 [备选方案]${NC} MAC地址修改失败,但可以使用更直接的JS内核修改方案" - echo -e "${BLUE}💡 [说明]${NC} JS内核修改直接绕过Cursor的设备检测,效果更好" + echo -e "${BLUE}� [说明]${NC} MAC地址修改失败,可以重试或跳过此接口" + echo -e "${BLUE}� [备注]${NC} 如果所有接口都失败,脚本会自动尝试JS内核修改方案" - select_menu_option "MAC地址修改失败,您可以:" "重试本接口|跳过本接口|使用JS内核修改|退出脚本" 0 + select_menu_option "MAC地址修改失败,您可以:" "重试本接口|跳过本接口|退出脚本" 0 local choice=$? if [ "$choice" = "0" ]; then log_info "用户选择重试本接口。" @@ -934,15 +1133,6 @@ _change_mac_for_one_interface() { elif [ "$choice" = "1" ]; then log_info "用户选择跳过本接口。" return 1 - elif [ "$choice" = "2" ]; then - log_info "用户选择使用JS内核修改方案。" - if modify_cursor_js_files; then - log_info "✅ [成功] JS内核修改完成,已实现设备识别绕过" - return 0 - else - log_error "❌ [失败] JS内核修改也失败了" - return 1 - fi else log_info "用户选择退出脚本。" exit 1 @@ -1352,37 +1542,23 @@ change_system_mac_address() { # 🔧 Apple Silicon智能替代方案 if [[ "$HARDWARE_TYPE" == "Apple Silicon" ]]; then echo -e "${BLUE}🔧 [智能方案]${NC} 检测到Apple Silicon环境,MAC地址修改受硬件限制" - echo -e "${BLUE}💡 [替代方案]${NC} 将使用Cursor内核JS修改实现更直接的设备识别绕过" + echo -e "${BLUE}💡 [自动切换]${NC} 将自动使用JS内核修改实现更直接的设备识别绕过" echo - log_info "🔄 [切换] 自动切换到JS内核修改方案..." + log_info "🔄 [智能切换] 自动切换到JS内核修改方案..." if modify_cursor_js_files; then log_info "✅ [成功] JS内核修改完成,已实现设备识别绕过" - log_info "💡 [说明] 此方案比MAC地址修改更直接有效" + log_info "💡 [说明] 此方案比MAC地址修改更直接有效,完美适配Apple Silicon" return 0 else log_warn "⚠️ [警告] JS内核修改失败,将继续尝试MAC地址修改" fi fi + # 非Apple Silicon环境或JS修改失败时,询问是否继续MAC地址修改 read -p "是否继续尝试MAC地址修改?(y/n): " continue_choice if [[ ! "$continue_choice" =~ ^(y|yes)$ ]]; then log_info "用户选择跳过MAC地址修改" - - # 提供JS修改作为备选方案 - echo - echo -e "${BLUE}🔧 [备选方案]${NC} 是否尝试使用JS内核修改实现设备识别绕过?" - read -p "这种方法更直接有效 (y/n): " js_choice - if [[ "$js_choice" =~ ^(y|yes)$ ]]; then - if modify_cursor_js_files; then - log_info "✅ [成功] JS内核修改完成" - return 0 - else - log_error "❌ [失败] JS内核修改失败" - return 1 - fi - fi - return 1 fi fi @@ -1469,27 +1645,20 @@ change_system_mac_address() { if $overall_success; then return 0 # 所有尝试都成功 else - # 🔧 MAC地址修改失败时提供JS内核修改备选方案 + # 🔧 MAC地址修改失败时自动切换到JS内核修改 echo log_warn "⚠️ [警告] MAC地址修改失败或部分失败" - echo -e "${BLUE}🔧 [备选方案]${NC} 检测到MAC地址修改困难,建议使用JS内核修改方案" - echo -e "${BLUE}💡 [优势]${NC} JS内核修改直接修改Cursor设备检测逻辑,绕过效果更好" - echo + log_info "� [智能切换] 自动切换到JS内核修改方案..." + log_info "💡 [说明] JS内核修改直接修改Cursor设备检测逻辑,绕过效果更好" - read -p "是否尝试使用JS内核修改作为备选方案?(y/n): " js_fallback_choice - if [[ "$js_fallback_choice" =~ ^(y|yes)$ ]]; then - log_info "🔄 [切换] 尝试使用JS内核修改方案..." - if modify_cursor_js_files; then - log_info "✅ [成功] JS内核修改完成,已实现设备识别绕过" - log_info "💡 [说明] 虽然MAC地址修改失败,但JS内核修改提供了更直接的解决方案" - return 0 - else - log_error "❌ [失败] JS内核修改也失败了" - return 1 - fi + if modify_cursor_js_files; then + log_info "✅ [成功] JS内核修改完成,已实现设备识别绕过" + log_info "💡 [结果] 虽然MAC地址修改失败,但JS内核修改提供了更直接的解决方案" + return 0 else - log_info "用户选择不使用备选方案" - return 1 # 至少有一个尝试失败 + log_error "❌ [失败] JS内核修改也失败了" + log_error "💥 [严重] 所有设备识别绕过方案都失败了" + return 1 fi fi }