Browse Source

优化Apple Silicon环境下的MAC地址修改逻辑,新增完全自动化模式,无需用户确认。改进用户交互,确保在MAC地址修改失败时自动切换到JS内核修改方案,减少用户干预。增强Cursor目录权限管理,确保启动前权限正确,提升脚本的安全性和用户体验。

master v0.0.190
煎饼果子卷鲨鱼辣椒 2 weeks ago
parent
commit
421e7fd2da
  1. 27
      scripts/docs/apple_silicon_mac_solution.md
  2. 178
      scripts/docs/cursor_permission_fix_complete.md
  3. 262
      scripts/fix/cursor_permission_fix.sh
  4. 305
      scripts/run/cursor_mac_id_modifier.sh

27
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方案,无需用户选择
- **最小化交互** - 只在必要时询问用户(如重试失败的接口)
- **智能备选** - 双重保障确保设备识别绕过成功
## 🛡️ 安全考虑

178
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. **联系支持** - 提供详细的错误日志

262
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 "$@"

305
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
}

Loading…
Cancel
Save