Browse Source
优化Apple Silicon环境下的MAC地址修改逻辑,新增完全自动化模式,无需用户确认。改进用户交互,确保在MAC地址修改失败时自动切换到JS内核修改方案,减少用户干预。增强Cursor目录权限管理,确保启动前权限正确,提升脚本的安全性和用户体验。
master
v0.0.190
优化Apple Silicon环境下的MAC地址修改逻辑,新增完全自动化模式,无需用户确认。改进用户交互,确保在MAC地址修改失败时自动切换到JS内核修改方案,减少用户干预。增强Cursor目录权限管理,确保启动前权限正确,提升脚本的安全性和用户体验。
master
v0.0.190
4 changed files with 694 additions and 78 deletions
-
27scripts/docs/apple_silicon_mac_solution.md
-
178scripts/docs/cursor_permission_fix_complete.md
-
262scripts/fix/cursor_permission_fix.sh
-
305scripts/run/cursor_mac_id_modifier.sh
@ -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. **联系支持** - 提供详细的错误日志 |
@ -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 "$@" |
Write
Preview
Loading…
Cancel
Save
Reference in new issue