Browse Source

优化Cursor macOS机器码修改脚本中的权限修复功能,删除冗余的权限修复命令,整合并简化权限验证流程,确保在删除文件夹后立即执行权限修复,提升代码可读性和可维护性。同时,增强启动前权限修复的逻辑,确保Cursor正常启动时权限设置正确。

master v0.0.203
煎饼果子卷鲨鱼辣椒 2 days ago
parent
commit
3a3d490025
  1. 332
      scripts/run/cursor_mac_id_modifier.sh
  2. 688
      scripts/run/cursor_mac_id_modifier_new.sh

332
scripts/run/cursor_mac_id_modifier.sh

@ -111,132 +111,11 @@ remove_cursor_trial_folders() {
echo echo
done 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 echo
# 🔧 额外修复:再次调用统一权限修复函数确保一致性
log_info "🔧 [额外修复] 使用统一权限修复函数进行最终确认..."
# 调用统一的权限修复函数
ensure_cursor_directory_permissions ensure_cursor_directory_permissions
# 显示操作统计 # 显示操作统计
@ -271,51 +150,9 @@ restart_cursor_and_wait() {
return 1 return 1
fi 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 # 启动Cursor
log_info "🚀 [启动] 正在启动Cursor..." log_info "🚀 [启动] 正在启动Cursor..."
@ -437,11 +274,8 @@ start_cursor_to_generate_config() {
log_info "📍 [路径] 使用Cursor路径: $cursor_executable" log_info "📍 [路径] 使用Cursor路径: $cursor_executable"
# 🚀 关键修复:Cursor启动前权限最终确保
ensure_cursor_startup_permissions
# 🚨 额外修复:执行用户要求的关键权限修复
fix_cursor_permissions_critical
# 🚀 启动前权限修复
ensure_cursor_directory_permissions
# 启动Cursor # 启动Cursor
"$cursor_executable" > /dev/null 2>&1 & "$cursor_executable" > /dev/null 2>&1 &
@ -475,141 +309,61 @@ start_cursor_to_generate_config() {
fi fi
} }
# 🛡️ 确保Cursor目录权限正确(简化版本)
# 🛡️ 统一权限修复函数(优化版本)
ensure_cursor_directory_permissions() { ensure_cursor_directory_permissions() {
log_info "🛡️ [权限修复] 开始简化权限修复..."
log_info "🛡️ [权限修复] 执行核心权限修复命令..."
local cursor_support_dir="$HOME/Library/Application Support/Cursor" local cursor_support_dir="$HOME/Library/Application Support/Cursor"
local cursor_home_dir="$HOME/.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
# 命令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目录所有权修复成功"
# 🔧 执行用户验证有效的4个核心权限修复命令
log_info "🔧 [修复] 执行4个核心权限修复命令..."
# 命令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 else
log_error "❌ [所有权] Application Support/Cursor目录所有权修复失败"
return 1
log_warn "⚠️ [1/4] sudo chown Application Support/Cursor 失败"
fi 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 else
log_error "❌ [所有权] .cursor目录所有权修复失败"
return 1
log_warn "⚠️ [2/4] sudo chown .cursor 失败"
fi 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 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 else
log_error "❌ [写入权限] Application Support/Cursor写入权限设置失败"
return 1
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
log_warn "⚠️ [3/4] chmod Application Support/Cursor 失败"
fi 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 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 fi
log_info "✅ [完成] 权限修复完成,所有验证通过"
log_info "✅ [完成] 核心权限修复命令执行完成"
return 0 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() { fix_cursor_permissions_critical() {
log_info "🚨 [关键权限修复] 调用简化权限修复函数..."
log_info "🚨 [关键权限修复] 执行权限修复..."
ensure_cursor_directory_permissions ensure_cursor_directory_permissions
} }
# 🚀 Cursor启动前权限最终确保(简化版本)
# 🚀 Cursor启动前权限确保(简化版本)
ensure_cursor_startup_permissions() { ensure_cursor_startup_permissions() {
log_info "🚀 [启动前权限] 调用简化权限修复函数..."
log_info "🚀 [启动前权限] 执行权限修复..."
ensure_cursor_directory_permissions ensure_cursor_directory_permissions
} }
@ -2841,8 +2595,9 @@ main() {
initialize_log initialize_log
log_info "脚本启动..." log_info "脚本启动..."
# 🚀 启动时权限预检查和修复(解决EACCES错误)
startup_permissions_check
# 🚀 启动时权限修复(解决EACCES错误)
log_info "🚀 [启动时权限] 执行启动时权限修复..."
ensure_cursor_directory_permissions
# 记录系统信息 # 记录系统信息
log_info "系统信息: $(uname -a)" log_info "系统信息: $(uname -a)"
@ -3115,16 +2870,9 @@ main() {
echo -e "${GREEN}================================${NC}" echo -e "${GREEN}================================${NC}"
echo echo
# 🛡️ 关键修复:脚本执行完成前最终权限修复
# 🛡️ 脚本完成前最终权限修复
echo echo
log_info "🛡️ [最终权限修复] 执行脚本完成前的最终权限修复..." log_info "🛡️ [最终权限修复] 执行脚本完成前的最终权限修复..."
log_info "💡 [说明] 确保Cursor应用能够正常启动,无权限错误"
# 执行权限修复
ensure_cursor_directory_permissions
# 最终权限修复确保
log_info "🔍 [最终修复] 执行最终权限修复确保..."
ensure_cursor_directory_permissions ensure_cursor_directory_permissions
# 🎉 脚本执行完成 # 🎉 脚本执行完成

688
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 "$@"
Loading…
Cancel
Save