Compare commits
12 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c5386b51ad | ||
![]() |
5f86b0a76a | ||
![]() |
3a3d490025 | ||
![]() |
abe92608bc | ||
![]() |
24396c5a7a | ||
![]() |
8065efd6af | ||
![]() |
460b2b47a7 | ||
![]() |
7507be7e8b | ||
![]() |
3504d0e5e2 | ||
![]() |
81763a34dd | ||
![]() |
e319c2c972 | ||
![]() |
40d7e844a2 |
14
README.md
@ -270,7 +270,7 @@ irm https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/
|
||||
**Windows (Enhanced Version)**
|
||||
|
||||
```powershell
|
||||
irm https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier_new.ps1 | iex
|
||||
irm https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier.ps1 | iex
|
||||
```
|
||||
> Enhanced Cursor machine code modifier with dual-mode operation and trial reset functionality
|
||||
|
||||
@ -304,7 +304,7 @@ irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaoti
|
||||
**Windows (Enhanced Version)**
|
||||
|
||||
```powershell
|
||||
irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier_new.ps1 | iex
|
||||
irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier.ps1 | iex
|
||||
```
|
||||
> Enhanced Cursor machine code modifier with dual-mode operation and trial reset functionality
|
||||
|
||||
@ -338,7 +338,7 @@ irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaoti
|
||||
|
||||
For the enhanced version:
|
||||
```powershell
|
||||
irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier_new.ps1 | iex
|
||||
irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier.ps1 | iex
|
||||
```
|
||||
|
||||
##### Method 3: Using Search
|
||||
@ -354,7 +354,7 @@ irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaoti
|
||||
|
||||
For the enhanced version:
|
||||
```powershell
|
||||
irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier_new.ps1 | iex
|
||||
irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier.ps1 | iex
|
||||
```
|
||||
|
||||
### 🔧 PowerShell Installation Guide
|
||||
@ -509,7 +509,7 @@ Modifying this registry key may affect:
|
||||
|
||||
## 💬 Feedback & Suggestions
|
||||
|
||||
We value your feedback on the new enhanced script! If you've tried the `cursor_win_id_modifier_new.ps1` script, please share your experience:
|
||||
We value your feedback on the new enhanced script! If you've tried the `cursor_win_id_modifier.ps1` script, please share your experience:
|
||||
|
||||
- 🐛 **Bug Reports**: Found any issues? Let us know!
|
||||
- 💡 **Feature Suggestions**: Have ideas for improvements?
|
||||
@ -544,8 +544,8 @@ Your feedback helps us improve the tool for everyone. Feel free to open an issue
|
||||
</td>
|
||||
<td align="center">
|
||||
<b>WeChat</b><br>
|
||||
<img src="img/qun-15.jpg" width="500" alt="WeChat"><br>
|
||||
<em>二维码7天内(7月14日前)有效,过期请加微信</em>
|
||||
<img src="img/qun-16.png" width="500" alt="WeChat"><br>
|
||||
<em>二维码7天内(8月4日前前)有效,过期请加微信</em>
|
||||
</td>
|
||||
<!-- <td align="center">
|
||||
<b>ETC</b><br>
|
||||
|
12
README_CN.md
@ -208,7 +208,7 @@ irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaoti
|
||||
**Windows (增强版)**
|
||||
|
||||
```powershell
|
||||
irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier_new.ps1 | iex
|
||||
irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier.ps1 | iex
|
||||
```
|
||||
> 增强版Cursor机器码修改工具,支持双模式操作和试用重置功能
|
||||
<div align="center">
|
||||
@ -244,7 +244,7 @@ irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaoti
|
||||
|
||||
增强版脚本:
|
||||
```powershell
|
||||
irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier_new.ps1 | iex
|
||||
irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier.ps1 | iex
|
||||
```
|
||||
|
||||
##### 方法三:通过搜索启动
|
||||
@ -260,7 +260,7 @@ irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaoti
|
||||
|
||||
增强版脚本:
|
||||
```powershell
|
||||
irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier_new.ps1 | iex
|
||||
irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier.ps1 | iex
|
||||
```
|
||||
|
||||
### 🔧 PowerShell 安装指南
|
||||
@ -461,8 +461,8 @@ irm https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/
|
||||
</td>
|
||||
<td align="center">
|
||||
<b>微信交流群</b><br>
|
||||
<img src="img/qun-15.jpg" width="500" alt="WeChat"><br>
|
||||
<small>二维码7天内(7月14日前)有效,过期请加微信</small>
|
||||
<img src="img/qun-16.png" width="500" alt="WeChat"><br>
|
||||
<small>二维码7天内(8月4日前)有效,过期请加微信</small>
|
||||
</td>
|
||||
<td align="center">
|
||||
<b>公众号</b><br>
|
||||
@ -494,7 +494,7 @@ irm https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/
|
||||
|
||||
## 💬 反馈与建议
|
||||
|
||||
我们非常重视您对新增强脚本的反馈!如果您已经尝试了 `cursor_win_id_modifier_new.ps1` 脚本,请分享您的使用体验:
|
||||
我们非常重视您对新增强脚本的反馈!如果您已经尝试了 `cursor_win_id_modifier.ps1` 脚本,请分享您的使用体验:
|
||||
|
||||
- 🐛 **错误报告**:发现任何问题?请告诉我们!
|
||||
- 💡 **功能建议**:有改进想法?
|
||||
|
14
README_JP.md
@ -265,7 +265,7 @@ irm https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/
|
||||
**Windows (強化版)**
|
||||
|
||||
```powershell
|
||||
irm https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier_new.ps1 | iex
|
||||
irm https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier.ps1 | iex
|
||||
```
|
||||
> デュアルモード操作とトライアルリセット機能を備えた強化版Cursorマシンコード修正ツール
|
||||
|
||||
@ -301,7 +301,7 @@ irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaoti
|
||||
**Windows (強化版)**
|
||||
|
||||
```powershell
|
||||
irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier_new.ps1 | iex
|
||||
irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier.ps1 | iex
|
||||
```
|
||||
> デュアルモード操作とトライアルリセット機能を備えた強化版Cursorマシンコード修正ツール
|
||||
|
||||
@ -335,7 +335,7 @@ irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaoti
|
||||
|
||||
強化版スクリプト:
|
||||
```powershell
|
||||
irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier_new.ps1 | iex
|
||||
irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier.ps1 | iex
|
||||
```
|
||||
|
||||
##### 方法3: 検索を使用する
|
||||
@ -351,7 +351,7 @@ irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaoti
|
||||
|
||||
強化版スクリプト:
|
||||
```powershell
|
||||
irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier_new.ps1 | iex
|
||||
irm https://aizaozao.com/accelerate.php/https://raw.githubusercontent.com/yuaotian/go-cursor-help/refs/heads/master/scripts/run/cursor_win_id_modifier.ps1 | iex
|
||||
```
|
||||
|
||||
### 🔧 PowerShellインストールガイド
|
||||
@ -528,8 +528,8 @@ macOS/Linuxユーザーはシステム内で同様の`cursor-updater`ディレ
|
||||
</td>
|
||||
<td align="center">
|
||||
<b>WeChat</b><br>
|
||||
<img src="img/qun-15.jpg" width="500" alt="WeChat"><br>
|
||||
<em>二维码7天内(7月14日前)有效,过期请加微信</em>
|
||||
<img src="img/qun-16.png" width="500" alt="WeChat"><br>
|
||||
<em>二维码7天内(8月4日前前)有效,过期请加微信</em>
|
||||
</td>
|
||||
<!-- <td align="center">
|
||||
<b>ETC</b><br>
|
||||
@ -546,7 +546,7 @@ ETC: 0xa2745f4CD5d32310AC01694ABDB28bA32D125a6b
|
||||
|
||||
## 💬 フィードバック&提案
|
||||
|
||||
新しい強化スクリプトに関するフィードバックをお待ちしています!`cursor_win_id_modifier_new.ps1` スクリプトをお試しいただいた方は、ぜひご体験をお聞かせください:
|
||||
新しい強化スクリプトに関するフィードバックをお待ちしています!`cursor_win_id_modifier.ps1` スクリプトをお試しいただいた方は、ぜひご体験をお聞かせください:
|
||||
|
||||
- 🐛 **バグレポート**:問題を発見されましたか?お知らせください!
|
||||
- 💡 **機能提案**:改善のアイデアはありますか?
|
||||
|
BIN
img/qun-10.jpg
Before Width: | Height: | Size: 128 KiB |
BIN
img/qun-12.png
Before Width: | Height: | Size: 124 KiB |
BIN
img/qun-14.jpg
Before Width: | Height: | Size: 128 KiB |
BIN
img/qun-15.jpg
Before Width: | Height: | Size: 132 KiB |
BIN
img/qun-16.png
Normal file
After Width: | Height: | Size: 128 KiB |
BIN
img/qun-8.png
Before Width: | Height: | Size: 147 KiB |
BIN
img/qun11.jpg
Before Width: | Height: | Size: 129 KiB |
BIN
img/qun13.png
Before Width: | Height: | Size: 127 KiB |
BIN
img/qun9.png
Before Width: | Height: | Size: 126 KiB |
BIN
img/wx_group.jpg
Before Width: | Height: | Size: 175 KiB |
Before Width: | Height: | Size: 179 KiB |
@ -1161,7 +1161,8 @@ fix_damaged_app() {
|
||||
fi
|
||||
|
||||
log_info "尝试移除隔离属性..."
|
||||
if sudo xattr -rd com.apple.quarantine "$CURSOR_APP_PATH" 2>/dev/null; then
|
||||
if sudo find "$CURSOR_APP_PATH" -print0 \
|
||||
| xargs -0 sudo xattr -d com.apple.quarantine 2>/dev/null
|
||||
log_info "成功移除隔离属性"
|
||||
else
|
||||
log_warn "移除隔离属性失败,尝试其他方法..."
|
||||
|
@ -1,5 +1,23 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ========================================
|
||||
# Cursor macOS 机器码修改脚本 (增强权限修复版)
|
||||
# ========================================
|
||||
#
|
||||
# 🔧 权限修复增强:
|
||||
# - 集成用户提供的核心权限修复命令
|
||||
# - 特别处理logs目录权限问题
|
||||
# - 解决EACCES: permission denied错误
|
||||
# - 确保Cursor能正常启动
|
||||
#
|
||||
# 🚨 如果遇到权限错误,脚本会自动执行:
|
||||
# - sudo chown -R $(whoami) ~/Library/"Application Support"/Cursor
|
||||
# - sudo chown -R $(whoami) ~/.cursor
|
||||
# - chmod -R u+w ~/Library/"Application Support"/Cursor
|
||||
# - chmod -R u+w ~/.cursor/extensions
|
||||
#
|
||||
# ========================================
|
||||
|
||||
# 设置错误处理
|
||||
set -e
|
||||
|
||||
@ -93,128 +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
|
||||
|
||||
# 🔑 关键修复:使用sudo确保目录所有权(解决EACCES错误)
|
||||
log_info "🔑 [关键修复] 使用sudo确保目录所有权正确..."
|
||||
if sudo chown -R "$(whoami)" "$HOME/Library/Application Support/Cursor" 2>/dev/null; then
|
||||
log_info "✅ [成功] sudo设置Application Support/Cursor目录所有权成功"
|
||||
else
|
||||
log_warn "⚠️ [警告] sudo设置Application Support/Cursor目录所有权失败"
|
||||
fi
|
||||
|
||||
if sudo chown -R "$(whoami)" "$HOME/.cursor" 2>/dev/null; then
|
||||
log_info "✅ [成功] sudo设置.cursor目录所有权成功"
|
||||
else
|
||||
log_warn "⚠️ [警告] sudo设置.cursor目录所有权失败"
|
||||
fi
|
||||
|
||||
# 🔓 关键修复:设置用户写入权限
|
||||
log_info "🔓 [关键修复] 设置用户写入权限..."
|
||||
if chmod -R u+w "$HOME/Library/Application Support/Cursor" 2>/dev/null; then
|
||||
log_info "✅ [成功] 设置Application Support/Cursor写入权限成功"
|
||||
else
|
||||
log_warn "⚠️ [警告] 设置Application Support/Cursor写入权限失败"
|
||||
fi
|
||||
|
||||
if chmod -R u+w "$HOME/.cursor/extensions" 2>/dev/null; then
|
||||
log_info "✅ [成功] 设置.cursor/extensions写入权限成功"
|
||||
else
|
||||
log_warn "⚠️ [警告] 设置.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 "<22> [权限修复] 删除文件夹后立即执行权限修复..."
|
||||
echo
|
||||
|
||||
# 🔧 额外修复:再次调用统一权限修复函数确保一致性
|
||||
log_info "🔧 [额外修复] 使用统一权限修复函数进行最终确认..."
|
||||
# 调用统一的权限修复函数
|
||||
ensure_cursor_directory_permissions
|
||||
|
||||
# 显示操作统计
|
||||
@ -249,41 +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
|
||||
|
||||
# 🔑 最终权限修复:使用sudo确保权限正确
|
||||
log_info "🔑 [最终修复] 使用sudo确保启动前权限正确..."
|
||||
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
|
||||
chmod -R u+w "$HOME/.cursor" 2>/dev/null || true
|
||||
|
||||
# 🚀 关键修复:Cursor启动前权限最终确保
|
||||
ensure_cursor_startup_permissions
|
||||
# 🔧 启动前权限修复
|
||||
log_info "🔧 [启动前权限] 执行启动前权限修复..."
|
||||
ensure_cursor_directory_permissions
|
||||
|
||||
# 启动Cursor
|
||||
log_info "🚀 [启动] 正在启动Cursor..."
|
||||
@ -405,8 +274,8 @@ start_cursor_to_generate_config() {
|
||||
|
||||
log_info "📍 [路径] 使用Cursor路径: $cursor_executable"
|
||||
|
||||
# 🚀 关键修复:Cursor启动前权限最终确保
|
||||
ensure_cursor_startup_permissions
|
||||
# 🚀 启动前权限修复
|
||||
ensure_cursor_directory_permissions
|
||||
|
||||
# 启动Cursor
|
||||
"$cursor_executable" > /dev/null 2>&1 &
|
||||
@ -440,572 +309,68 @@ 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)
|
||||
|
||||
# 扩展的关键目录列表(包含所有可能的子目录)
|
||||
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"
|
||||
)
|
||||
# 确保目录存在
|
||||
mkdir -p "$cursor_support_dir" 2>/dev/null || true
|
||||
mkdir -p "$cursor_home_dir/extensions" 2>/dev/null || true
|
||||
|
||||
# 🔍 第一步:权限诊断
|
||||
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
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
if [ ${#final_issues[@]} -eq 0 ]; then
|
||||
log_info "✅ [验证成功] 所有目录权限验证通过"
|
||||
else
|
||||
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
|
||||
|
||||
log_info "✅ [完成] 增强权限修复完成"
|
||||
}
|
||||
|
||||
# 🚨 关键权限修复函数(用户要求的核心修复)
|
||||
fix_cursor_permissions_critical() {
|
||||
log_info "🚨 [关键权限修复] 执行用户要求的关键权限修复..."
|
||||
|
||||
local cursor_support_dir="$HOME/Library/Application Support/Cursor"
|
||||
local cursor_home_dir="$HOME/.cursor"
|
||||
local success=true
|
||||
|
||||
# 执行用户明确要求的权限修复命令
|
||||
log_info "🔧 [核心命令] 执行核心权限修复命令..."
|
||||
# 🔧 执行用户验证有效的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 "✅ [成功] sudo chown -R \$(whoami) ~/Library/Application\ Support/Cursor"
|
||||
log_info "✅ [1/4] sudo chown Application Support/Cursor 成功"
|
||||
else
|
||||
log_error "❌ [失败] sudo chown -R \$(whoami) ~/Library/Application\ Support/Cursor"
|
||||
success=false
|
||||
log_warn "⚠️ [1/4] sudo chown Application Support/Cursor 失败"
|
||||
fi
|
||||
|
||||
# 命令2: sudo chown -R $(whoami) ~/.cursor
|
||||
if sudo chown -R "$(whoami)" "$cursor_home_dir" 2>/dev/null; then
|
||||
log_info "✅ [成功] sudo chown -R \$(whoami) ~/.cursor"
|
||||
log_info "✅ [2/4] sudo chown .cursor 成功"
|
||||
else
|
||||
log_error "❌ [失败] sudo chown -R \$(whoami) ~/.cursor"
|
||||
success=false
|
||||
log_warn "⚠️ [2/4] sudo chown .cursor 失败"
|
||||
fi
|
||||
|
||||
# 额外的权限设置确保Cursor能正常启动
|
||||
log_info "🔧 [额外修复] 设置额外权限确保Cursor正常启动..."
|
||||
|
||||
# 设置目录权限
|
||||
chmod -R 755 "$cursor_support_dir" 2>/dev/null || true
|
||||
chmod -R 755 "$cursor_home_dir" 2>/dev/null || true
|
||||
|
||||
# 设置用户写入权限
|
||||
chmod -R u+w "$cursor_support_dir" 2>/dev/null || true
|
||||
chmod -R u+w "$cursor_home_dir" 2>/dev/null || true
|
||||
|
||||
# 验证权限修复结果
|
||||
log_info "🔍 [验证] 验证权限修复结果..."
|
||||
|
||||
if [ -w "$cursor_support_dir" ] && [ -w "$cursor_home_dir" ]; then
|
||||
log_info "✅ [验证成功] 关键目录权限验证通过"
|
||||
log_info "💡 [结果] Cursor应用现在应该能够正常启动"
|
||||
# 命令3: chmod -R u+w ~/Library/"Application Support"/Cursor
|
||||
if chmod -R u+w "$cursor_support_dir" 2>/dev/null; then
|
||||
log_info "✅ [3/4] chmod Application Support/Cursor 成功"
|
||||
else
|
||||
log_warn "⚠️ [验证警告] 部分目录权限可能仍有问题"
|
||||
log_info "💡 [建议] 如果Cursor启动仍有问题,请手动执行:"
|
||||
echo " sudo chown -R \$(whoami) \"$cursor_support_dir\""
|
||||
echo " sudo chown -R \$(whoami) \"$cursor_home_dir\""
|
||||
success=false
|
||||
log_warn "⚠️ [3/4] chmod Application Support/Cursor 失败"
|
||||
fi
|
||||
|
||||
if $success; then
|
||||
log_info "✅ [完成] 关键权限修复完成"
|
||||
return 0
|
||||
# 命令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_warn "⚠️ [警告] 关键权限修复部分失败"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# 🚀 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"
|
||||
)
|
||||
|
||||
# 🔧 第一步:基础权限确保
|
||||
log_info "🔧 [基础权限] 确保基础权限设置..."
|
||||
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/$HOME/\~} 权限正确"
|
||||
else
|
||||
log_warn "⚠️ [基础权限] ${dir/$HOME/\~} 权限异常,尝试强制修复..."
|
||||
sudo chown -R "$current_user:staff" "$dir" 2>/dev/null || true
|
||||
sudo chmod -R 755 "$dir" 2>/dev/null || true
|
||||
fi
|
||||
done
|
||||
|
||||
# 🚀 第二步:应用macOS高级权限处理
|
||||
log_info "🚀 [高级权限] 应用macOS特有的高级权限处理..."
|
||||
for dir in "${startup_dirs[@]}"; do
|
||||
if [ -d "$dir" ]; then
|
||||
log_info "🔧 [高级处理] 处理目录: ${dir/$HOME/\~}"
|
||||
apply_macos_advanced_permissions "$dir" || log_warn "⚠️ [高级处理] 高级权限处理失败: ${dir/$HOME/\~}"
|
||||
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目录
|
||||
if apply_macos_advanced_permissions "$logs_dir"; then
|
||||
log_info "✅ [logs高级] logs目录高级权限处理成功"
|
||||
else
|
||||
log_warn "⚠️ [logs高级] logs目录高级权限处理失败"
|
||||
log_warn "⚠️ [4/4] chmod .cursor/extensions 失败"
|
||||
fi
|
||||
|
||||
# 🧪 第四步:模拟Cursor启动行为测试
|
||||
log_info "🧪 [启动模拟] 模拟Cursor启动行为测试..."
|
||||
|
||||
# 模拟Cursor创建时间戳目录的行为
|
||||
local timestamp_dir="$logs_dir/startup_test_$(date +%Y%m%dT%H%M%S)"
|
||||
if mkdir -p "$timestamp_dir" 2>/dev/null; then
|
||||
log_info "✅ [启动模拟] 时间戳目录创建测试成功"
|
||||
|
||||
# 测试在时间戳目录中创建文件
|
||||
local test_log_file="$timestamp_dir/startup.log"
|
||||
if touch "$test_log_file" 2>/dev/null; then
|
||||
log_info "✅ [启动模拟] 启动日志文件创建测试成功"
|
||||
rm -f "$test_log_file" 2>/dev/null || true
|
||||
else
|
||||
log_warn "⚠️ [启动模拟] 启动日志文件创建测试失败"
|
||||
fi
|
||||
|
||||
rmdir "$timestamp_dir" 2>/dev/null || true
|
||||
else
|
||||
log_error "❌ [启动模拟] 时间戳目录创建测试失败"
|
||||
|
||||
# 最后的强制修复尝试
|
||||
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
|
||||
|
||||
# 再次应用高级权限
|
||||
apply_macos_advanced_permissions "$cursor_support_dir/logs"
|
||||
|
||||
# 再次测试
|
||||
if mkdir -p "$timestamp_dir" 2>/dev/null; then
|
||||
log_info "✅ [最后修复] 强制修复后测试成功"
|
||||
rmdir "$timestamp_dir" 2>/dev/null || true
|
||||
else
|
||||
log_error "❌ [最后修复] 强制修复后测试仍然失败"
|
||||
fi
|
||||
fi
|
||||
|
||||
log_info "✅ [启动前权限] Cursor启动前权限确保完成(增强版)"
|
||||
}
|
||||
|
||||
# 🔧 macOS特有的深入权限处理(新增核心函数)
|
||||
apply_macos_advanced_permissions() {
|
||||
local target_dir="$1"
|
||||
local current_user=$(whoami)
|
||||
|
||||
log_info "🔧 [高级权限] 开始macOS特有的深入权限处理: ${target_dir/$HOME/\~}"
|
||||
|
||||
# 🧹 第一步:清理扩展属性
|
||||
log_info "🧹 [扩展属性] 清理可能干扰权限的扩展属性..."
|
||||
if xattr -cr "$target_dir" 2>/dev/null; then
|
||||
log_info "✅ [扩展属性] 扩展属性清理成功"
|
||||
else
|
||||
log_warn "⚠️ [扩展属性] 扩展属性清理失败或无需清理"
|
||||
fi
|
||||
|
||||
# 🔐 第二步:设置ACL权限
|
||||
log_info "🔐 [ACL权限] 设置访问控制列表权限..."
|
||||
|
||||
# 为当前用户设置完整的ACL权限,包括继承
|
||||
local acl_rule="user:$current_user allow read,write,execute,delete,add_file,add_subdirectory,inherit"
|
||||
if chmod +a "$acl_rule" "$target_dir" 2>/dev/null; then
|
||||
log_info "✅ [ACL权限] 用户ACL权限设置成功"
|
||||
else
|
||||
log_warn "⚠️ [ACL权限] 用户ACL权限设置失败,可能已存在或不支持"
|
||||
fi
|
||||
|
||||
# 为staff组设置ACL权限
|
||||
local staff_acl_rule="group:staff allow read,write,execute,add_file,add_subdirectory,inherit"
|
||||
if chmod +a "$staff_acl_rule" "$target_dir" 2>/dev/null; then
|
||||
log_info "✅ [ACL权限] staff组ACL权限设置成功"
|
||||
else
|
||||
log_warn "⚠️ [ACL权限] staff组ACL权限设置失败,可能已存在或不支持"
|
||||
fi
|
||||
|
||||
# 🔄 第三步:刷新权限缓存
|
||||
log_info "🔄 [权限缓存] 刷新系统权限缓存..."
|
||||
if sudo dscacheutil -flushcache 2>/dev/null; then
|
||||
log_info "✅ [权限缓存] 系统权限缓存刷新成功"
|
||||
else
|
||||
log_warn "⚠️ [权限缓存] 系统权限缓存刷新失败"
|
||||
fi
|
||||
|
||||
# 刷新目录服务缓存
|
||||
if sudo killall -HUP DirectoryService 2>/dev/null; then
|
||||
log_info "✅ [目录服务] 目录服务缓存刷新成功"
|
||||
else
|
||||
log_warn "⚠️ [目录服务] 目录服务缓存刷新失败或不需要"
|
||||
fi
|
||||
|
||||
# ⏰ 第四步:等待权限缓存更新
|
||||
log_info "⏰ [等待] 等待权限缓存更新生效..."
|
||||
sleep 2
|
||||
|
||||
# 🧪 第五步:权限验证测试
|
||||
log_info "🧪 [验证] 执行权限验证测试..."
|
||||
|
||||
# 测试基础读写权限
|
||||
local test_file="$target_dir/.permission_test_$(date +%s)"
|
||||
if touch "$test_file" 2>/dev/null; then
|
||||
log_info "✅ [验证] 基础文件创建权限正常"
|
||||
rm -f "$test_file" 2>/dev/null || true
|
||||
else
|
||||
log_error "❌ [验证] 基础文件创建权限异常"
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 测试子目录创建权限(模拟Cursor行为)
|
||||
local test_subdir="$target_dir/test_subdir_$(date +%s)"
|
||||
if mkdir -p "$test_subdir" 2>/dev/null; then
|
||||
log_info "✅ [验证] 子目录创建权限正常"
|
||||
|
||||
# 测试子目录中的文件创建
|
||||
local test_subfile="$test_subdir/test_file"
|
||||
if touch "$test_subfile" 2>/dev/null; then
|
||||
log_info "✅ [验证] 子目录文件创建权限正常"
|
||||
rm -f "$test_subfile" 2>/dev/null || true
|
||||
else
|
||||
log_warn "⚠️ [验证] 子目录文件创建权限异常"
|
||||
fi
|
||||
|
||||
rmdir "$test_subdir" 2>/dev/null || true
|
||||
else
|
||||
log_error "❌ [验证] 子目录创建权限异常"
|
||||
return 1
|
||||
fi
|
||||
|
||||
log_info "✅ [高级权限] macOS特有的深入权限处理完成"
|
||||
log_info "✅ [完成] 核心权限修复命令执行完成"
|
||||
return 0
|
||||
}
|
||||
|
||||
# 🛡️ 增强的Cursor权限完整修复(新增函数)
|
||||
ensure_cursor_complete_permissions() {
|
||||
log_info "🛡️ [完整权限] 开始Cursor权限完整修复..."
|
||||
|
||||
local cursor_support_dir="$HOME/Library/Application Support/Cursor"
|
||||
local cursor_home_dir="$HOME/.cursor"
|
||||
local current_user=$(whoami)
|
||||
|
||||
# 关键目录列表
|
||||
local critical_dirs=(
|
||||
"$cursor_support_dir"
|
||||
"$cursor_support_dir/logs"
|
||||
"$cursor_support_dir/User"
|
||||
"$cursor_support_dir/User/globalStorage"
|
||||
"$cursor_home_dir"
|
||||
"$cursor_home_dir/extensions"
|
||||
)
|
||||
|
||||
# 🚨 关键修复:强制执行用户要求的权限修复命令
|
||||
log_info "🚨 [关键修复] 执行用户要求的核心权限修复命令..."
|
||||
|
||||
# 执行用户明确要求的权限修复命令
|
||||
if sudo chown -R "$(whoami)" "$HOME/Library/Application Support/Cursor" 2>/dev/null; then
|
||||
log_info "✅ [核心修复] sudo chown Application Support/Cursor 执行成功"
|
||||
else
|
||||
log_error "❌ [核心修复] sudo chown Application Support/Cursor 执行失败"
|
||||
fi
|
||||
|
||||
if sudo chown -R "$(whoami)" "$HOME/.cursor" 2>/dev/null; then
|
||||
log_info "✅ [核心修复] sudo chown .cursor 执行成功"
|
||||
else
|
||||
log_error "❌ [核心修复] sudo chown .cursor 执行失败"
|
||||
fi
|
||||
|
||||
# 🔧 第一步:基础权限修复
|
||||
log_info "🔧 [基础权限] 执行基础权限修复..."
|
||||
# 关键权限修复函数(简化版本)
|
||||
fix_cursor_permissions_critical() {
|
||||
log_info "🚨 [关键权限修复] 执行权限修复..."
|
||||
ensure_cursor_directory_permissions
|
||||
|
||||
# 🚀 第二步:高级权限处理
|
||||
log_info "🚀 [高级权限] 执行macOS特有的高级权限处理..."
|
||||
|
||||
for dir in "${critical_dirs[@]}"; do
|
||||
if [ -d "$dir" ]; then
|
||||
log_info "🔧 [处理] 处理目录: ${dir/$HOME/\~}"
|
||||
if ! apply_macos_advanced_permissions "$dir"; then
|
||||
log_warn "⚠️ [警告] 目录高级权限处理失败: ${dir/$HOME/\~}"
|
||||
fi
|
||||
else
|
||||
log_warn "⚠️ [跳过] 目录不存在: ${dir/$HOME/\~}"
|
||||
fi
|
||||
done
|
||||
|
||||
# 🎯 第三步:特别处理logs目录
|
||||
log_info "🎯 [logs特殊] 特别处理logs目录权限..."
|
||||
local logs_dir="$cursor_support_dir/logs"
|
||||
|
||||
# 确保logs目录存在
|
||||
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
|
||||
|
||||
# 应用高级权限
|
||||
if apply_macos_advanced_permissions "$logs_dir"; then
|
||||
log_info "✅ [logs特殊] logs目录高级权限处理成功"
|
||||
else
|
||||
log_warn "⚠️ [logs特殊] logs目录高级权限处理失败"
|
||||
fi
|
||||
|
||||
# 🧪 第四步:模拟Cursor行为测试
|
||||
log_info "🧪 [Cursor模拟] 模拟Cursor应用行为测试..."
|
||||
|
||||
# 模拟Cursor创建时间戳目录的行为
|
||||
local timestamp_dir="$logs_dir/test_$(date +%Y%m%dT%H%M%S)"
|
||||
if mkdir -p "$timestamp_dir" 2>/dev/null; then
|
||||
log_info "✅ [Cursor模拟] 时间戳目录创建测试成功"
|
||||
|
||||
# 测试在时间戳目录中创建文件
|
||||
local test_log_file="$timestamp_dir/test.log"
|
||||
if touch "$test_log_file" 2>/dev/null; then
|
||||
log_info "✅ [Cursor模拟] 日志文件创建测试成功"
|
||||
rm -f "$test_log_file" 2>/dev/null || true
|
||||
else
|
||||
log_warn "⚠️ [Cursor模拟] 日志文件创建测试失败"
|
||||
fi
|
||||
|
||||
rmdir "$timestamp_dir" 2>/dev/null || true
|
||||
else
|
||||
log_error "❌ [Cursor模拟] 时间戳目录创建测试失败"
|
||||
|
||||
# 如果模拟失败,尝试最后的强制修复
|
||||
log_info "🔧 [最后修复] 执行最后的强制权限修复..."
|
||||
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
|
||||
|
||||
# 再次应用高级权限
|
||||
apply_macos_advanced_permissions "$logs_dir"
|
||||
|
||||
# 再次测试
|
||||
if mkdir -p "$timestamp_dir" 2>/dev/null; then
|
||||
log_info "✅ [最后修复] 强制修复后测试成功"
|
||||
rmdir "$timestamp_dir" 2>/dev/null || true
|
||||
else
|
||||
log_error "❌ [最后修复] 强制修复后测试仍然失败"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# 🔍 第五步:最终权限诊断
|
||||
log_info "🔍 [最终诊断] 执行最终权限诊断..."
|
||||
|
||||
echo "📋 [权限报告] 最终权限状态:"
|
||||
echo "----------------------------------------"
|
||||
|
||||
for dir in "${critical_dirs[@]}"; do
|
||||
if [ -d "$dir" ]; then
|
||||
local perms=$(ls -ld "$dir" | awk '{print $1}')
|
||||
local owner=$(ls -ld "$dir" | awk '{print $3":"$4}')
|
||||
|
||||
# 检查ACL权限
|
||||
local acl_info=""
|
||||
if ls -le "$dir" 2>/dev/null | grep -q "user:$current_user"; then
|
||||
acl_info=" [ACL:✅]"
|
||||
else
|
||||
acl_info=" [ACL:❌]"
|
||||
fi
|
||||
|
||||
echo "✅ ${dir/$HOME/\~}: $perms $owner$acl_info"
|
||||
else
|
||||
echo "❌ ${dir/$HOME/\~}: 不存在"
|
||||
fi
|
||||
done
|
||||
|
||||
log_info "✅ [完整权限] Cursor权限完整修复完成"
|
||||
return 0
|
||||
}
|
||||
|
||||
# 🚀 Cursor启动前权限确保(简化版本)
|
||||
ensure_cursor_startup_permissions() {
|
||||
log_info "🚀 [启动前权限] 执行权限修复..."
|
||||
ensure_cursor_directory_permissions
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# 🛠️ 修改机器码配置(增强版)
|
||||
modify_machine_code_config() {
|
||||
local mode=${1:-"FULL"}
|
||||
@ -1219,11 +584,8 @@ except Exception as e:
|
||||
log_warn "⚠️ [警告] 无法设置配置文件只读保护"
|
||||
fi
|
||||
|
||||
# 🛡️ 关键修复:执行完整的权限修复(包含macOS高级权限处理)
|
||||
ensure_cursor_complete_permissions
|
||||
|
||||
# 🚨 额外的关键权限修复(用户要求的核心修复)
|
||||
fix_cursor_permissions_critical
|
||||
# 🛡️ 关键修复:执行权限修复
|
||||
ensure_cursor_directory_permissions
|
||||
|
||||
echo
|
||||
log_info "🎉 [成功] 机器码配置修改完成!"
|
||||
@ -1244,8 +606,7 @@ except Exception as e:
|
||||
# 恢复备份并确保权限正确
|
||||
if cp "$backup_path" "$config_path"; then
|
||||
chmod 644 "$config_path" 2>/dev/null || true
|
||||
ensure_cursor_complete_permissions
|
||||
fix_cursor_permissions_critical
|
||||
ensure_cursor_directory_permissions
|
||||
log_info "✅ [恢复] 已恢复原始配置并修复权限"
|
||||
else
|
||||
log_error "❌ [错误] 恢复备份失败"
|
||||
@ -1262,8 +623,7 @@ except Exception as e:
|
||||
log_info "🔄 [恢复] 正在恢复备份配置并修复权限..."
|
||||
if cp "$backup_path" "$config_path"; then
|
||||
chmod 644 "$config_path" 2>/dev/null || true
|
||||
ensure_cursor_complete_permissions
|
||||
fix_cursor_permissions_critical
|
||||
ensure_cursor_directory_permissions
|
||||
log_info "✅ [恢复] 已恢复原始配置并修复权限"
|
||||
else
|
||||
log_error "❌ [错误] 恢复备份失败"
|
||||
@ -2430,16 +1790,8 @@ change_system_mac_address() {
|
||||
fi
|
||||
}
|
||||
|
||||
# 生成随机 ID
|
||||
generate_random_id() {
|
||||
# 生成32字节(64个十六进制字符)的随机数
|
||||
openssl rand -hex 32
|
||||
}
|
||||
|
||||
# 生成随机 UUID
|
||||
generate_uuid() {
|
||||
uuidgen | tr '[:upper:]' '[:lower:]'
|
||||
}
|
||||
|
||||
|
||||
# 修改现有文件
|
||||
modify_or_add_config() {
|
||||
@ -3136,7 +2488,9 @@ fix_damaged_app() {
|
||||
fi
|
||||
|
||||
log_info "尝试移除隔离属性..."
|
||||
if sudo xattr -rd com.apple.quarantine "$CURSOR_APP_PATH" 2>/dev/null; then
|
||||
if sudo find "$CURSOR_APP_PATH" -print0 \
|
||||
| xargs -0 sudo xattr -d com.apple.quarantine 2>/dev/null
|
||||
then
|
||||
log_info "成功移除隔离属性"
|
||||
else
|
||||
log_warn "移除隔离属性失败,尝试其他方法..."
|
||||
@ -3157,7 +2511,7 @@ fix_damaged_app() {
|
||||
echo "2. 暂时关闭Gatekeeper(不建议): sudo spctl --master-disable"
|
||||
echo "3. 重新下载安装Cursor应用"
|
||||
echo
|
||||
echo -e "${BLUE}参考链接: https://sysin.org/blog/macos-if-crashes-when-opening/${NC}"
|
||||
echo -e "${BLUE} 参考链接: https://sysin.org/blog/macos-if-crashes-when-opening/ ${NC}"
|
||||
|
||||
return 0
|
||||
}
|
||||
@ -3241,6 +2595,10 @@ main() {
|
||||
initialize_log
|
||||
log_info "脚本启动..."
|
||||
|
||||
# 🚀 启动时权限修复(解决EACCES错误)
|
||||
log_info "🚀 [启动时权限] 执行启动时权限修复..."
|
||||
ensure_cursor_directory_permissions
|
||||
|
||||
# 记录系统信息
|
||||
log_info "系统信息: $(uname -a)"
|
||||
log_info "当前用户: $CURRENT_USER"
|
||||
@ -3275,6 +2633,7 @@ main() {
|
||||
echo -e "${YELLOW}💡 [重要提示]${NC} 本工具采用分阶段执行策略,既能彻底清理又能修改机器码。"
|
||||
echo -e "${YELLOW}💡 [重要提示]${NC} 本工具免费,如果对您有帮助,请关注公众号【煎饼果子卷AI】"
|
||||
echo
|
||||
echo
|
||||
|
||||
# 🎯 用户选择菜单
|
||||
echo
|
||||
@ -3417,8 +2776,19 @@ main() {
|
||||
echo
|
||||
log_info "🛡️ [权限修复] 执行仅修改模式的权限修复..."
|
||||
log_info "💡 [说明] 确保Cursor应用能够正常启动,无权限错误"
|
||||
ensure_cursor_complete_permissions
|
||||
fix_cursor_permissions_critical
|
||||
ensure_cursor_directory_permissions
|
||||
|
||||
# 🔧 关键修复:修复应用签名问题(防止"应用已损坏"错误)
|
||||
echo
|
||||
log_info "🔧 [应用修复] 正在修复Cursor应用签名问题..."
|
||||
log_info "💡 [说明] 防止出现'应用已损坏,无法打开'的错误"
|
||||
|
||||
if fix_damaged_app; then
|
||||
log_info "✅ [应用修复] Cursor应用签名修复成功"
|
||||
else
|
||||
log_warn "⚠️ [应用修复] 应用签名修复失败,可能需要手动处理"
|
||||
log_info "💡 [建议] 如果Cursor无法启动,请在系统偏好设置中允许打开"
|
||||
fi
|
||||
else
|
||||
# 完整的重置环境+修改机器码流程
|
||||
log_info "🚀 [开始] 开始执行重置环境+修改机器码功能..."
|
||||
@ -3457,6 +2827,18 @@ main() {
|
||||
log_warn "⚠️ [警告] 设备识别绕过失败或部分失败"
|
||||
log_info "💡 [提示] 但可能已通过JS内核修改实现了绕过效果"
|
||||
fi
|
||||
|
||||
# 🔧 关键修复:修复应用签名问题(防止"应用已损坏"错误)
|
||||
echo
|
||||
log_info "🔧 [应用修复] 正在修复Cursor应用签名问题..."
|
||||
log_info "💡 [说明] 防止出现'应用已损坏,无法打开'的错误"
|
||||
|
||||
if fix_damaged_app; then
|
||||
log_info "✅ [应用修复] Cursor应用签名修复成功"
|
||||
else
|
||||
log_warn "⚠️ [应用修复] 应用签名修复失败,可能需要手动处理"
|
||||
log_info "💡 [建议] 如果Cursor无法启动,请在系统偏好设置中允许打开"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 🚫 禁用自动更新
|
||||
@ -3488,36 +2870,10 @@ main() {
|
||||
echo -e "${GREEN}================================${NC}"
|
||||
echo
|
||||
|
||||
# 🛡️ 关键修复:脚本执行完成前的最终权限修复
|
||||
# 🛡️ 脚本完成前最终权限修复
|
||||
echo
|
||||
log_info "🛡️ [最终权限修复] 执行脚本完成前的最终权限修复..."
|
||||
log_info "💡 [说明] 确保Cursor应用能够正常启动,无权限错误"
|
||||
|
||||
# 执行完整的权限修复
|
||||
ensure_cursor_complete_permissions
|
||||
|
||||
# 执行用户要求的关键权限修复
|
||||
fix_cursor_permissions_critical
|
||||
|
||||
# 额外的权限验证和修复
|
||||
log_info "🔍 [最终验证] 执行最终权限验证..."
|
||||
local cursor_support_dir="$HOME/Library/Application Support/Cursor"
|
||||
local cursor_home_dir="$HOME/.cursor"
|
||||
|
||||
# 确保关键目录可写
|
||||
if [ ! -w "$cursor_support_dir" ] || [ ! -w "$cursor_home_dir" ]; then
|
||||
log_warn "⚠️ [权限警告] 检测到权限问题,执行紧急修复..."
|
||||
|
||||
# 紧急权限修复
|
||||
sudo chown -R "$(whoami)" "$cursor_support_dir" 2>/dev/null || true
|
||||
sudo chown -R "$(whoami)" "$cursor_home_dir" 2>/dev/null || true
|
||||
chmod -R u+w "$cursor_support_dir" 2>/dev/null || true
|
||||
chmod -R u+w "$cursor_home_dir" 2>/dev/null || true
|
||||
|
||||
log_info "✅ [紧急修复] 紧急权限修复完成"
|
||||
else
|
||||
log_info "✅ [权限验证] 最终权限验证通过"
|
||||
fi
|
||||
ensure_cursor_directory_permissions
|
||||
|
||||
# 🎉 脚本执行完成
|
||||
log_info "🎉 [完成] 所有操作已完成!"
|
||||
|
688
scripts/run/cursor_mac_id_modifier_new.sh
Normal file
@ -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 "$@"
|
@ -13,6 +13,235 @@ $NC = "`e[0m"
|
||||
$STORAGE_FILE = "$env:APPDATA\Cursor\User\globalStorage\storage.json"
|
||||
$BACKUP_DIR = "$env:APPDATA\Cursor\User\globalStorage\backups"
|
||||
|
||||
# PowerShell原生方法生成随机字符串
|
||||
function Generate-RandomString {
|
||||
param([int]$Length)
|
||||
$chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
|
||||
$result = ""
|
||||
for ($i = 0; $i -lt $Length; $i++) {
|
||||
$result += $chars[(Get-Random -Maximum $chars.Length)]
|
||||
}
|
||||
return $result
|
||||
}
|
||||
|
||||
# 修改Cursor内核JS文件实现设备识别绕过(从macOS版本移植)
|
||||
function Modify-CursorJSFiles {
|
||||
Write-Host ""
|
||||
Write-Host "$BLUE🔧 [内核修改]$NC 开始修改Cursor内核JS文件实现设备识别绕过..."
|
||||
Write-Host ""
|
||||
|
||||
# Windows版Cursor应用路径
|
||||
$cursorAppPath = "${env:LOCALAPPDATA}\Programs\Cursor"
|
||||
if (-not (Test-Path $cursorAppPath)) {
|
||||
# 尝试其他可能的安装路径
|
||||
$alternatePaths = @(
|
||||
"${env:ProgramFiles}\Cursor",
|
||||
"${env:ProgramFiles(x86)}\Cursor",
|
||||
"${env:USERPROFILE}\AppData\Local\Programs\Cursor"
|
||||
)
|
||||
|
||||
foreach ($path in $alternatePaths) {
|
||||
if (Test-Path $path) {
|
||||
$cursorAppPath = $path
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if (-not (Test-Path $cursorAppPath)) {
|
||||
Write-Host "$RED❌ [错误]$NC 未找到Cursor应用安装路径"
|
||||
Write-Host "$YELLOW💡 [提示]$NC 请确认Cursor已正确安装"
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host "$GREEN✅ [发现]$NC 找到Cursor安装路径: $cursorAppPath"
|
||||
|
||||
# 生成新的设备标识符
|
||||
$newUuid = [System.Guid]::NewGuid().ToString().ToLower()
|
||||
$machineId = "auth0|user_$(Generate-RandomString -Length 32)"
|
||||
$deviceId = [System.Guid]::NewGuid().ToString().ToLower()
|
||||
$macMachineId = Generate-RandomString -Length 64
|
||||
|
||||
Write-Host "$GREEN🔑 [生成]$NC 已生成新的设备标识符"
|
||||
|
||||
# 目标JS文件列表(Windows路径)
|
||||
$jsFiles = @(
|
||||
"$cursorAppPath\resources\app\out\vs\workbench\api\node\extensionHostProcess.js",
|
||||
"$cursorAppPath\resources\app\out\main.js",
|
||||
"$cursorAppPath\resources\app\out\vs\code\node\cliProcessMain.js"
|
||||
)
|
||||
|
||||
$modifiedCount = 0
|
||||
$needModification = $false
|
||||
|
||||
# 检查是否需要修改
|
||||
Write-Host "$BLUE🔍 [检查]$NC 检查JS文件修改状态..."
|
||||
foreach ($file in $jsFiles) {
|
||||
if (-not (Test-Path $file)) {
|
||||
Write-Host "$YELLOW⚠️ [警告]$NC 文件不存在: $(Split-Path $file -Leaf)"
|
||||
continue
|
||||
}
|
||||
|
||||
$content = Get-Content $file -Raw -ErrorAction SilentlyContinue
|
||||
if ($content -and $content -notmatch "return crypto\.randomUUID\(\)") {
|
||||
Write-Host "$BLUE📝 [需要]$NC 文件需要修改: $(Split-Path $file -Leaf)"
|
||||
$needModification = $true
|
||||
break
|
||||
} else {
|
||||
Write-Host "$GREEN✅ [已修改]$NC 文件已修改: $(Split-Path $file -Leaf)"
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $needModification) {
|
||||
Write-Host "$GREEN✅ [跳过]$NC 所有JS文件已经被修改过,无需重复操作"
|
||||
return $true
|
||||
}
|
||||
|
||||
# 关闭Cursor进程
|
||||
Write-Host "$BLUE🔄 [关闭]$NC 关闭Cursor进程以进行文件修改..."
|
||||
Stop-AllCursorProcesses -MaxRetries 3 -WaitSeconds 3 | Out-Null
|
||||
|
||||
# 创建备份
|
||||
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
|
||||
$backupPath = "$env:TEMP\Cursor_JS_Backup_$timestamp"
|
||||
|
||||
Write-Host "$BLUE💾 [备份]$NC 创建Cursor JS文件备份..."
|
||||
try {
|
||||
New-Item -ItemType Directory -Path $backupPath -Force | Out-Null
|
||||
foreach ($file in $jsFiles) {
|
||||
if (Test-Path $file) {
|
||||
$fileName = Split-Path $file -Leaf
|
||||
Copy-Item $file "$backupPath\$fileName" -Force
|
||||
}
|
||||
}
|
||||
Write-Host "$GREEN✅ [备份]$NC 备份创建成功: $backupPath"
|
||||
} catch {
|
||||
Write-Host "$RED❌ [错误]$NC 创建备份失败: $($_.Exception.Message)"
|
||||
return $false
|
||||
}
|
||||
|
||||
# 修改JS文件
|
||||
Write-Host "$BLUE🔧 [修改]$NC 开始修改JS文件..."
|
||||
|
||||
foreach ($file in $jsFiles) {
|
||||
if (-not (Test-Path $file)) {
|
||||
Write-Host "$YELLOW⚠️ [跳过]$NC 文件不存在: $(Split-Path $file -Leaf)"
|
||||
continue
|
||||
}
|
||||
|
||||
Write-Host "$BLUE📝 [处理]$NC 正在处理: $(Split-Path $file -Leaf)"
|
||||
|
||||
try {
|
||||
$content = Get-Content $file -Raw -Encoding UTF8
|
||||
|
||||
# 检查是否已经修改过
|
||||
if ($content -match "return crypto\.randomUUID\(\)" -or $content -match "// Cursor ID 修改工具注入") {
|
||||
Write-Host "$GREEN✅ [跳过]$NC 文件已经被修改过"
|
||||
$modifiedCount++
|
||||
continue
|
||||
}
|
||||
|
||||
# ES模块兼容的JavaScript注入代码
|
||||
$timestampVar = [DateTimeOffset]::Now.ToUnixTimeSeconds()
|
||||
$injectCode = @"
|
||||
// Cursor ID 修改工具注入 - $(Get-Date) - ES模块兼容版本
|
||||
import crypto from 'crypto';
|
||||
|
||||
// 保存原始函数引用
|
||||
const originalRandomUUID_${timestampVar} = crypto.randomUUID;
|
||||
|
||||
// 重写crypto.randomUUID方法
|
||||
crypto.randomUUID = function() {
|
||||
return '${newUuid}';
|
||||
};
|
||||
|
||||
// 覆盖所有可能的系统ID获取函数 - ES模块兼容版本
|
||||
globalThis.getMachineId = function() { return '${machineId}'; };
|
||||
globalThis.getDeviceId = function() { return '${deviceId}'; };
|
||||
globalThis.macMachineId = '${macMachineId}';
|
||||
|
||||
// 确保在不同环境下都能访问
|
||||
if (typeof window !== 'undefined') {
|
||||
window.getMachineId = globalThis.getMachineId;
|
||||
window.getDeviceId = globalThis.getDeviceId;
|
||||
window.macMachineId = globalThis.macMachineId;
|
||||
}
|
||||
|
||||
// 确保模块顶层执行
|
||||
console.log('Cursor设备标识符已成功劫持 - ES模块版本 煎饼果子(86) 关注公众号【煎饼果子卷AI】一起交流更多Cursor技巧和AI知识(脚本免费、关注公众号加群有更多技巧和大佬)');
|
||||
|
||||
"@
|
||||
|
||||
# 方法1: 查找IOPlatformUUID相关函数
|
||||
if ($content -match "IOPlatformUUID") {
|
||||
Write-Host "$BLUE🔍 [发现]$NC 找到IOPlatformUUID关键字"
|
||||
|
||||
# 针对不同的函数模式进行修改
|
||||
if ($content -match "function a\$") {
|
||||
$content = $content -replace "function a\$\(t\)\{switch", "function a`$(t){return crypto.randomUUID(); switch"
|
||||
Write-Host "$GREEN✅ [成功]$NC 修改a`$函数成功"
|
||||
$modifiedCount++
|
||||
continue
|
||||
}
|
||||
|
||||
# 通用注入方法
|
||||
$content = $injectCode + $content
|
||||
Write-Host "$GREEN✅ [成功]$NC 通用注入方法修改成功"
|
||||
$modifiedCount++
|
||||
}
|
||||
# 方法2: 查找其他设备ID相关函数
|
||||
elseif ($content -match "function t\$\(\)" -or $content -match "async function y5") {
|
||||
Write-Host "$BLUE🔍 [发现]$NC 找到设备ID相关函数"
|
||||
|
||||
# 修改MAC地址获取函数
|
||||
if ($content -match "function t\$\(\)") {
|
||||
$content = $content -replace "function t\$\(\)\{", "function t`$(){return `"00:00:00:00:00:00`";"
|
||||
Write-Host "$GREEN✅ [成功]$NC 修改MAC地址获取函数"
|
||||
}
|
||||
|
||||
# 修改设备ID获取函数
|
||||
if ($content -match "async function y5") {
|
||||
$content = $content -replace "async function y5\(t\)\{", "async function y5(t){return crypto.randomUUID();"
|
||||
Write-Host "$GREEN✅ [成功]$NC 修改设备ID获取函数"
|
||||
}
|
||||
|
||||
$modifiedCount++
|
||||
}
|
||||
else {
|
||||
Write-Host "$YELLOW⚠️ [警告]$NC 未找到已知的设备ID函数模式,使用通用注入"
|
||||
$content = $injectCode + $content
|
||||
$modifiedCount++
|
||||
}
|
||||
|
||||
# 写入修改后的内容
|
||||
Set-Content -Path $file -Value $content -Encoding UTF8 -NoNewline
|
||||
Write-Host "$GREEN✅ [完成]$NC 文件修改完成: $(Split-Path $file -Leaf)"
|
||||
|
||||
} catch {
|
||||
Write-Host "$RED❌ [错误]$NC 修改文件失败: $($_.Exception.Message)"
|
||||
# 尝试从备份恢复
|
||||
$fileName = Split-Path $file -Leaf
|
||||
$backupFile = "$backupPath\$fileName"
|
||||
if (Test-Path $backupFile) {
|
||||
Copy-Item $backupFile $file -Force
|
||||
Write-Host "$YELLOW🔄 [恢复]$NC 已从备份恢复文件"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($modifiedCount -gt 0) {
|
||||
Write-Host ""
|
||||
Write-Host "$GREEN🎉 [完成]$NC 成功修改 $modifiedCount 个JS文件"
|
||||
Write-Host "$BLUE💾 [备份]$NC 原始文件备份位置: $backupPath"
|
||||
Write-Host "$BLUE💡 [说明]$NC JavaScript注入功能已启用,实现设备识别绕过"
|
||||
return $true
|
||||
} else {
|
||||
Write-Host "$RED❌ [失败]$NC 没有成功修改任何文件"
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
# 🚀 新增 Cursor 防掉试用Pro删除文件夹功能
|
||||
function Remove-CursorTrialFolders {
|
||||
Write-Host ""
|
||||
@ -962,7 +1191,8 @@ Write-Host ""
|
||||
Write-Host "$GREEN🎯 [选择模式]$NC 请选择您要执行的操作:"
|
||||
Write-Host ""
|
||||
Write-Host "$BLUE 1️⃣ 仅修改机器码$NC"
|
||||
Write-Host "$YELLOW • 仅执行机器码修改功能$NC"
|
||||
Write-Host "$YELLOW • 执行机器码修改功能$NC"
|
||||
Write-Host "$YELLOW • 执行注入破解JS代码到核心文件$NC"
|
||||
Write-Host "$YELLOW • 跳过文件夹删除/环境重置步骤$NC"
|
||||
Write-Host "$YELLOW • 保留现有Cursor配置和数据$NC"
|
||||
Write-Host ""
|
||||
@ -970,6 +1200,7 @@ Write-Host "$BLUE 2️⃣ 重置环境+修改机器码$NC"
|
||||
Write-Host "$RED • 执行完全环境重置(删除Cursor文件夹)$NC"
|
||||
Write-Host "$RED • ⚠️ 配置将丢失,请注意备份$NC"
|
||||
Write-Host "$YELLOW • 按照机器代码修改$NC"
|
||||
Write-Host "$YELLOW • 执行注入破解JS代码到核心文件$NC"
|
||||
Write-Host "$YELLOW • 这相当于当前的完整脚本行为$NC"
|
||||
Write-Host ""
|
||||
|
||||
@ -1433,223 +1664,6 @@ if ($executeMode -eq "MODIFY_ONLY") {
|
||||
}
|
||||
|
||||
|
||||
# <20> 修改Cursor内核JS文件实现设备识别绕过(从macOS版本移植)
|
||||
function Modify-CursorJSFiles {
|
||||
Write-Host ""
|
||||
Write-Host "$BLUE🔧 [内核修改]$NC 开始修改Cursor内核JS文件实现设备识别绕过..."
|
||||
Write-Host ""
|
||||
|
||||
# Windows版Cursor应用路径
|
||||
$cursorAppPath = "${env:LOCALAPPDATA}\Programs\Cursor"
|
||||
if (-not (Test-Path $cursorAppPath)) {
|
||||
# 尝试其他可能的安装路径
|
||||
$alternatePaths = @(
|
||||
"${env:ProgramFiles}\Cursor",
|
||||
"${env:ProgramFiles(x86)}\Cursor",
|
||||
"${env:USERPROFILE}\AppData\Local\Programs\Cursor"
|
||||
)
|
||||
|
||||
foreach ($path in $alternatePaths) {
|
||||
if (Test-Path $path) {
|
||||
$cursorAppPath = $path
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if (-not (Test-Path $cursorAppPath)) {
|
||||
Write-Host "$RED❌ [错误]$NC 未找到Cursor应用安装路径"
|
||||
Write-Host "$YELLOW💡 [提示]$NC 请确认Cursor已正确安装"
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
Write-Host "$GREEN✅ [发现]$NC 找到Cursor安装路径: $cursorAppPath"
|
||||
|
||||
# 生成新的设备标识符
|
||||
$newUuid = [System.Guid]::NewGuid().ToString().ToLower()
|
||||
$machineId = "auth0|user_$([System.Web.Security.Membership]::GeneratePassword(32, 0))"
|
||||
$deviceId = [System.Guid]::NewGuid().ToString().ToLower()
|
||||
$macMachineId = [System.Web.Security.Membership]::GeneratePassword(64, 0)
|
||||
|
||||
Write-Host "$GREEN🔑 [生成]$NC 已生成新的设备标识符"
|
||||
|
||||
# 目标JS文件列表(Windows路径)
|
||||
$jsFiles = @(
|
||||
"$cursorAppPath\resources\app\out\vs\workbench\api\node\extensionHostProcess.js",
|
||||
"$cursorAppPath\resources\app\out\main.js",
|
||||
"$cursorAppPath\resources\app\out\vs\code\node\cliProcessMain.js"
|
||||
)
|
||||
|
||||
$modifiedCount = 0
|
||||
$needModification = $false
|
||||
|
||||
# 检查是否需要修改
|
||||
Write-Host "$BLUE🔍 [检查]$NC 检查JS文件修改状态..."
|
||||
foreach ($file in $jsFiles) {
|
||||
if (-not (Test-Path $file)) {
|
||||
Write-Host "$YELLOW⚠️ [警告]$NC 文件不存在: $(Split-Path $file -Leaf)"
|
||||
continue
|
||||
}
|
||||
|
||||
$content = Get-Content $file -Raw -ErrorAction SilentlyContinue
|
||||
if ($content -and $content -notmatch "return crypto\.randomUUID\(\)") {
|
||||
Write-Host "$BLUE📝 [需要]$NC 文件需要修改: $(Split-Path $file -Leaf)"
|
||||
$needModification = $true
|
||||
break
|
||||
} else {
|
||||
Write-Host "$GREEN✅ [已修改]$NC 文件已修改: $(Split-Path $file -Leaf)"
|
||||
}
|
||||
}
|
||||
|
||||
if (-not $needModification) {
|
||||
Write-Host "$GREEN✅ [跳过]$NC 所有JS文件已经被修改过,无需重复操作"
|
||||
return $true
|
||||
}
|
||||
|
||||
# 关闭Cursor进程
|
||||
Write-Host "$BLUE🔄 [关闭]$NC 关闭Cursor进程以进行文件修改..."
|
||||
Stop-AllCursorProcesses -MaxRetries 3 -WaitSeconds 3 | Out-Null
|
||||
|
||||
# 创建备份
|
||||
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
|
||||
$backupPath = "$env:TEMP\Cursor_JS_Backup_$timestamp"
|
||||
|
||||
Write-Host "$BLUE💾 [备份]$NC 创建Cursor JS文件备份..."
|
||||
try {
|
||||
New-Item -ItemType Directory -Path $backupPath -Force | Out-Null
|
||||
foreach ($file in $jsFiles) {
|
||||
if (Test-Path $file) {
|
||||
$fileName = Split-Path $file -Leaf
|
||||
Copy-Item $file "$backupPath\$fileName" -Force
|
||||
}
|
||||
}
|
||||
Write-Host "$GREEN✅ [备份]$NC 备份创建成功: $backupPath"
|
||||
} catch {
|
||||
Write-Host "$RED❌ [错误]$NC 创建备份失败: $($_.Exception.Message)"
|
||||
return $false
|
||||
}
|
||||
|
||||
# 修改JS文件
|
||||
Write-Host "$BLUE🔧 [修改]$NC 开始修改JS文件..."
|
||||
|
||||
foreach ($file in $jsFiles) {
|
||||
if (-not (Test-Path $file)) {
|
||||
Write-Host "$YELLOW⚠️ [跳过]$NC 文件不存在: $(Split-Path $file -Leaf)"
|
||||
continue
|
||||
}
|
||||
|
||||
Write-Host "$BLUE📝 [处理]$NC 正在处理: $(Split-Path $file -Leaf)"
|
||||
|
||||
try {
|
||||
$content = Get-Content $file -Raw -Encoding UTF8
|
||||
|
||||
# 检查是否已经修改过
|
||||
if ($content -match "return crypto\.randomUUID\(\)" -or $content -match "// Cursor ID 修改工具注入") {
|
||||
Write-Host "$GREEN✅ [跳过]$NC 文件已经被修改过"
|
||||
$modifiedCount++
|
||||
continue
|
||||
}
|
||||
|
||||
# ES模块兼容的JavaScript注入代码
|
||||
$timestamp = [DateTimeOffset]::Now.ToUnixTimeSeconds()
|
||||
$injectCode = @"
|
||||
// Cursor ID 修改工具注入 - $(Get-Date) - ES模块兼容版本
|
||||
import crypto from 'crypto';
|
||||
|
||||
// 保存原始函数引用
|
||||
const originalRandomUUID_$timestamp = crypto.randomUUID;
|
||||
|
||||
// 重写crypto.randomUUID方法
|
||||
crypto.randomUUID = function() {
|
||||
return '$newUuid';
|
||||
};
|
||||
|
||||
// 覆盖所有可能的系统ID获取函数 - ES模块兼容版本
|
||||
globalThis.getMachineId = function() { return '$machineId'; };
|
||||
globalThis.getDeviceId = function() { return '$deviceId'; };
|
||||
globalThis.macMachineId = '$macMachineId';
|
||||
|
||||
// 确保在不同环境下都能访问
|
||||
if (typeof window !== 'undefined') {
|
||||
window.getMachineId = globalThis.getMachineId;
|
||||
window.getDeviceId = globalThis.getDeviceId;
|
||||
window.macMachineId = globalThis.macMachineId;
|
||||
}
|
||||
|
||||
// 确保模块顶层执行
|
||||
console.log('Cursor设备标识符已成功劫持 - ES模块版本 煎饼果子(86) 关注公众号【煎饼果子卷AI】一起交流更多Cursor技巧和AI知识(脚本免费、关注公众号加群有更多技巧和大佬)');
|
||||
|
||||
"@
|
||||
|
||||
# 方法1: 查找IOPlatformUUID相关函数
|
||||
if ($content -match "IOPlatformUUID") {
|
||||
Write-Host "$BLUE🔍 [发现]$NC 找到IOPlatformUUID关键字"
|
||||
|
||||
# 针对不同的函数模式进行修改
|
||||
if ($content -match "function a\$") {
|
||||
$content = $content -replace "function a\$\(t\)\{switch", "function a`$(t){return crypto.randomUUID(); switch"
|
||||
Write-Host "$GREEN✅ [成功]$NC 修改a`$函数成功"
|
||||
$modifiedCount++
|
||||
continue
|
||||
}
|
||||
|
||||
# 通用注入方法
|
||||
$content = $injectCode + $content
|
||||
Write-Host "$GREEN✅ [成功]$NC 通用注入方法修改成功"
|
||||
$modifiedCount++
|
||||
}
|
||||
# 方法2: 查找其他设备ID相关函数
|
||||
elseif ($content -match "function t\$\(\)" -or $content -match "async function y5") {
|
||||
Write-Host "$BLUE🔍 [发现]$NC 找到设备ID相关函数"
|
||||
|
||||
# 修改MAC地址获取函数
|
||||
if ($content -match "function t\$\(\)") {
|
||||
$content = $content -replace "function t\$\(\)\{", "function t`$(){return `"00:00:00:00:00:00`";"
|
||||
Write-Host "$GREEN✅ [成功]$NC 修改MAC地址获取函数"
|
||||
}
|
||||
|
||||
# 修改设备ID获取函数
|
||||
if ($content -match "async function y5") {
|
||||
$content = $content -replace "async function y5\(t\)\{", "async function y5(t){return crypto.randomUUID();"
|
||||
Write-Host "$GREEN✅ [成功]$NC 修改设备ID获取函数"
|
||||
}
|
||||
|
||||
$modifiedCount++
|
||||
}
|
||||
else {
|
||||
Write-Host "$YELLOW⚠️ [警告]$NC 未找到已知的设备ID函数模式,使用通用注入"
|
||||
$content = $injectCode + $content
|
||||
$modifiedCount++
|
||||
}
|
||||
|
||||
# 写入修改后的内容
|
||||
Set-Content -Path $file -Value $content -Encoding UTF8 -NoNewline
|
||||
Write-Host "$GREEN✅ [完成]$NC 文件修改完成: $(Split-Path $file -Leaf)"
|
||||
|
||||
} catch {
|
||||
Write-Host "$RED❌ [错误]$NC 修改文件失败: $($_.Exception.Message)"
|
||||
# 尝试从备份恢复
|
||||
$fileName = Split-Path $file -Leaf
|
||||
$backupFile = "$backupPath\$fileName"
|
||||
if (Test-Path $backupFile) {
|
||||
Copy-Item $backupFile $file -Force
|
||||
Write-Host "$YELLOW🔄 [恢复]$NC 已从备份恢复文件"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ($modifiedCount -gt 0) {
|
||||
Write-Host ""
|
||||
Write-Host "$GREEN🎉 [完成]$NC 成功修改 $modifiedCount 个JS文件"
|
||||
Write-Host "$BLUE💾 [备份]$NC 原始文件备份位置: $backupPath"
|
||||
Write-Host "$BLUE💡 [说明]$NC JavaScript注入功能已启用,实现设备识别绕过"
|
||||
return $true
|
||||
} else {
|
||||
Write-Host "$RED❌ [失败]$NC 没有成功修改任何文件"
|
||||
return $false
|
||||
}
|
||||
}
|
||||
|
||||
# 📱 显示公众号信息
|
||||
Write-Host ""
|
||||
Write-Host "$GREEN================================$NC"
|
||||
|