3
3
# 设置错误处理
4
4
set -e
5
5
6
+ # 定义日志文件路径
7
+ LOG_FILE=" /tmp/cursor_mac_id_modifier.log"
8
+
9
+ # 初始化日志文件
10
+ initialize_log () {
11
+ echo " ========== Cursor ID 修改工具日志开始 $( date) ==========" > " $LOG_FILE "
12
+ chmod 644 " $LOG_FILE "
13
+ }
14
+
6
15
# 颜色定义
7
16
RED=' \033[0;31m'
8
17
GREEN=' \033[0;32m'
9
18
YELLOW=' \033[1;33m'
10
19
BLUE=' \033[0;34m'
11
20
NC=' \033[0m' # No Color
12
21
13
- # 日志函数
22
+ # 日志函数 - 同时输出到终端和日志文件
14
23
log_info () {
15
24
echo -e " ${GREEN} [INFO]${NC} $1 "
25
+ echo " [INFO] $( date ' +%Y-%m-%d %H:%M:%S' ) $1 " >> " $LOG_FILE "
16
26
}
17
27
18
28
log_warn () {
19
29
echo -e " ${YELLOW} [WARN]${NC} $1 "
30
+ echo " [WARN] $( date ' +%Y-%m-%d %H:%M:%S' ) $1 " >> " $LOG_FILE "
20
31
}
21
32
22
33
log_error () {
23
34
echo -e " ${RED} [ERROR]${NC} $1 "
35
+ echo " [ERROR] $( date ' +%Y-%m-%d %H:%M:%S' ) $1 " >> " $LOG_FILE "
24
36
}
25
37
26
38
log_debug () {
27
39
echo -e " ${BLUE} [DEBUG]${NC} $1 "
40
+ echo " [DEBUG] $( date ' +%Y-%m-%d %H:%M:%S' ) $1 " >> " $LOG_FILE "
41
+ }
42
+
43
+ # 记录命令输出到日志文件
44
+ log_cmd_output () {
45
+ local cmd=" $1 "
46
+ local msg=" $2 "
47
+ echo " [CMD] $( date ' +%Y-%m-%d %H:%M:%S' ) 执行命令: $cmd " >> " $LOG_FILE "
48
+ echo " [CMD] $msg :" >> " $LOG_FILE "
49
+ eval " $cmd " 2>&1 | tee -a " $LOG_FILE "
50
+ echo " " >> " $LOG_FILE "
28
51
}
29
52
30
53
# 获取当前用户
@@ -226,15 +249,19 @@ generate_new_config() {
226
249
227
250
# 修改系统 ID
228
251
log_info " 正在修改系统 ID..."
252
+ echo " [CONFIG] 开始修改系统 ID" >> " $LOG_FILE "
229
253
230
254
# 备份当前系统 ID
231
255
backup_system_id
232
256
233
257
# 生成新的系统 UUID
234
258
local new_system_uuid=$( uuidgen)
259
+ echo " [CONFIG] 生成新的系统 UUID: $new_system_uuid " >> " $LOG_FILE "
235
260
236
261
# 修改系统 UUID
237
262
sudo nvram SystemUUID=" $new_system_uuid "
263
+ echo " [CONFIG] 已设置系统 UUID" >> " $LOG_FILE "
264
+
238
265
printf " ${YELLOW} 系统 UUID 已更新为: $new_system_uuid ${NC} \n"
239
266
printf " ${YELLOW} 请重启系统以使更改生效${NC} \n"
240
267
@@ -247,6 +274,12 @@ generate_new_config() {
247
274
local device_id=$( generate_uuid | tr ' [:upper:]' ' [:lower:]' )
248
275
local sqm_id=" {$( generate_uuid | tr ' [:lower:]' ' [:upper:]' ) }"
249
276
277
+ echo " [CONFIG] 生成的 ID:" >> " $LOG_FILE "
278
+ echo " [CONFIG] machine_id: $machine_id " >> " $LOG_FILE "
279
+ echo " [CONFIG] mac_machine_id: $mac_machine_id " >> " $LOG_FILE "
280
+ echo " [CONFIG] device_id: $device_id " >> " $LOG_FILE "
281
+ echo " [CONFIG] sqm_id: $sqm_id " >> " $LOG_FILE "
282
+
250
283
log_info " 正在修改配置文件..."
251
284
# 检查配置文件是否存在
252
285
if [ ! -f " $STORAGE_FILE " ]; then
@@ -298,6 +331,7 @@ generate_new_config() {
298
331
# 修改 Cursor 主程序文件(安全模式)
299
332
modify_cursor_app_files () {
300
333
log_info " 正在安全修改 Cursor 主程序文件..."
334
+ log_info " 详细日志将记录到: $LOG_FILE "
301
335
302
336
# 验证应用是否存在
303
337
if [ ! -d " $CURSOR_APP_PATH " ]; then
@@ -315,15 +349,20 @@ modify_cursor_app_files() {
315
349
local need_modification=false
316
350
local missing_files=false
317
351
352
+ log_debug " 检查目标文件..."
318
353
for file in " ${target_files[@]} " ; do
319
354
if [ ! -f " $file " ]; then
320
355
log_warn " 文件不存在: ${file/ $CURSOR_APP_PATH \/ / } "
356
+ echo " [FILE_CHECK] 文件不存在: $file " >> " $LOG_FILE "
321
357
missing_files=true
322
358
continue
323
359
fi
324
360
361
+ echo " [FILE_CHECK] 文件存在: $file ($( wc -c < " $file " ) 字节)" >> " $LOG_FILE "
362
+
325
363
if ! grep -q " return crypto.randomUUID()" " $file " 2> /dev/null; then
326
364
log_info " 文件需要修改: ${file/ $CURSOR_APP_PATH \/ / } "
365
+ grep -n " IOPlatformUUID" " $file " | head -3 >> " $LOG_FILE " || echo " [FILE_CHECK] 未找到 IOPlatformUUID" >> " $LOG_FILE "
327
366
need_modification=true
328
367
break
329
368
else
@@ -348,42 +387,59 @@ modify_cursor_app_files() {
348
387
local temp_app=" ${temp_dir} /Cursor.app"
349
388
local backup_app=" /tmp/Cursor.app.backup_${timestamp} "
350
389
390
+ log_debug " 创建临时目录: $temp_dir "
391
+ echo " [TEMP_DIR] 创建临时目录: $temp_dir " >> " $LOG_FILE "
392
+
351
393
# 清理可能存在的旧临时目录
352
394
if [ -d " $temp_dir " ]; then
353
395
log_info " 清理已存在的临时目录..."
354
396
rm -rf " $temp_dir "
355
- fi
397
+ }
356
398
357
399
# 创建新的临时目录
358
400
mkdir -p " $temp_dir " || {
359
401
log_error " 无法创建临时目录: $temp_dir "
402
+ echo " [ERROR] 无法创建临时目录: $temp_dir " >> " $LOG_FILE "
360
403
return 1
361
404
}
362
405
363
406
# 备份原应用
364
407
log_info " 备份原应用..."
408
+ echo " [BACKUP] 开始备份: $CURSOR_APP_PATH -> $backup_app " >> " $LOG_FILE "
409
+
365
410
cp -R " $CURSOR_APP_PATH " " $backup_app " || {
366
411
log_error " 无法创建应用备份"
412
+ echo " [ERROR] 备份失败: $CURSOR_APP_PATH -> $backup_app " >> " $LOG_FILE "
367
413
rm -rf " $temp_dir "
368
414
return 1
369
415
}
416
+
417
+ echo " [BACKUP] 备份完成" >> " $LOG_FILE "
370
418
371
419
# 复制应用到临时目录
372
420
log_info " 创建临时工作副本..."
421
+ echo " [COPY] 开始复制: $CURSOR_APP_PATH -> $temp_dir " >> " $LOG_FILE "
422
+
373
423
cp -R " $CURSOR_APP_PATH " " $temp_dir " || {
374
424
log_error " 无法复制应用到临时目录"
425
+ echo " [ERROR] 复制失败: $CURSOR_APP_PATH -> $temp_dir " >> " $LOG_FILE "
375
426
rm -rf " $temp_dir " " $backup_app "
376
427
return 1
377
428
}
429
+
430
+ echo " [COPY] 复制完成" >> " $LOG_FILE "
378
431
379
432
# 确保临时目录的权限正确
380
433
chown -R " $CURRENT_USER :staff" " $temp_dir "
381
434
chmod -R 755 " $temp_dir "
382
435
383
436
# 移除签名(增强兼容性)
384
437
log_info " 移除应用签名..."
385
- codesign --remove-signature " $temp_app " || {
438
+ echo " [CODESIGN] 移除签名: $temp_app " >> " $LOG_FILE "
439
+
440
+ codesign --remove-signature " $temp_app " 2>> " $LOG_FILE " || {
386
441
log_warn " 移除应用签名失败"
442
+ echo " [WARN] 移除签名失败: $temp_app " >> " $LOG_FILE "
387
443
}
388
444
389
445
# 移除所有相关组件的签名
@@ -416,50 +472,37 @@ modify_cursor_app_files() {
416
472
continue
417
473
fi
418
474
419
- log_debug " 分析文件内容..."
420
- log_debug " 文件大小: $( wc -c < " $file " ) 字节"
421
-
422
- # 尝试查找文件中的关键部分
423
- log_debug " 搜索关键函数..."
424
- grep -n " IOPlatformUUID" " $file " | head -3 || log_debug " 未找到 IOPlatformUUID"
425
- grep -n " function.*getMachineId" " $file " | head -3 || log_debug " 未找到 getMachineId 函数"
426
- grep -n " function.*getDeviceId" " $file " | head -3 || log_debug " 未找到 getDeviceId 函数"
427
- grep -n " function t\\ $" " $file " | head -3 || log_debug " 未找到 t$ 函数"
428
- grep -n " function a\\ $" " $file " | head -3 || log_debug " 未找到 a$ 函数"
429
-
430
- # 在出错时捕获更多信息
431
- trap ' log_error "脚本在 $LINENO 行附近失败了,命令: $BASH_COMMAND"; dump_debug_info "$file"' ERR
432
-
433
- dump_debug_info () {
434
- local file=" $1 "
435
- log_debug " === 调试信息 ==="
436
- log_debug " 文件: $file "
437
- log_debug " 文件存在: $( test -f " $file " && echo " 是" || echo " 否" ) "
438
- log_debug " 文件大小: $( wc -c < " $file " 2> /dev/null || echo " 无法读取" ) "
439
- log_debug " 文件权限: $( ls -l " $file " 2> /dev/null || echo " 无法获取" ) "
440
- log_debug " 部分内容: $( head -5 " $file " 2> /dev/null | tr ' \n' ' ' || echo " 无法读取" ) "
441
- log_debug " ================="
442
- }
475
+ log_debug " 处理文件: ${file/ $temp_dir \/ / } "
476
+ echo " [PROCESS] 开始处理文件: $file " >> " $LOG_FILE "
477
+ echo " [PROCESS] 文件大小: $( wc -c < " $file " ) 字节" >> " $LOG_FILE "
478
+
479
+ # 输出文件部分内容到日志
480
+ echo " [FILE_CONTENT] 文件头部 100 行:" >> " $LOG_FILE "
481
+ head -100 " $file " 2> /dev/null | grep -v " ^$" | head -50 >> " $LOG_FILE "
482
+ echo " [FILE_CONTENT] ..." >> " $LOG_FILE "
443
483
444
484
# 创建文件备份
445
485
cp " $file " " ${file} .bak" || {
446
486
log_error " 无法创建文件备份: ${file/ $temp_dir \/ / } "
487
+ echo " [ERROR] 无法创建文件备份: $file " >> " $LOG_FILE "
447
488
continue
448
489
}
449
490
450
491
# 使用 sed 替换而不是字符串操作
451
492
if grep -q " IOPlatformUUID" " $file " ; then
452
493
log_debug " 找到 IOPlatformUUID 关键字"
494
+ echo " [FOUND] 找到 IOPlatformUUID 关键字" >> " $LOG_FILE "
495
+ grep -n " IOPlatformUUID" " $file " | head -5 >> " $LOG_FILE "
453
496
454
497
# 定位 IOPlatformUUID 相关函数
455
- if grep -q " function a\\ $" " $file " ; then
498
+ if grep -q " function a\$ " " $file " ; then
456
499
# 针对 main.js 中发现的代码结构进行修改
457
500
if sed -i.tmp ' s/function a\$(t){switch/function a\$(t){return crypto.randomUUID(); switch/' " $file " ; then
458
- log_debug " 成功注入 randomUUID 调用到 a$ 函数"
501
+ log_debug " 成功注入 randomUUID 调用到 a\ $ 函数"
459
502
(( modified_count++ ))
460
503
log_info " 成功修改文件: ${file/ $temp_dir \/ / } "
461
504
else
462
- log_error " 修改 a$ 函数失败"
505
+ log_error " 修改 a\ $ 函数失败"
463
506
cp " ${file} .bak" " $file "
464
507
fi
465
508
elif grep -q " async function v5" " $file " ; then
@@ -567,8 +610,13 @@ global.macMachineId = '${mac_machine_id}';
567
610
fi
568
611
fi
569
612
613
+ # 添加在关键操作后记录日志
614
+ echo " [MODIFIED] 文件修改后内容:" >> " $LOG_FILE "
615
+ grep -n " return crypto.randomUUID()" " $file " | head -3 >> " $LOG_FILE "
616
+
570
617
# 清理临时文件
571
618
rm -f " ${file} .tmp" " ${file} .bak"
619
+ echo " [PROCESS] 文件处理完成: $file " >> " $LOG_FILE "
572
620
done
573
621
574
622
if [ " $modified_count " -eq 0 ]; then
@@ -881,13 +929,23 @@ restore_feature() {
881
929
# 主函数
882
930
main () {
883
931
932
+ # 初始化日志文件
933
+ initialize_log
934
+ log_info " 脚本启动..."
935
+
936
+ # 记录系统信息
937
+ log_info " 系统信息: $( uname -a) "
938
+ log_info " 当前用户: $CURRENT_USER "
939
+ log_cmd_output " sw_vers" " macOS 版本信息"
940
+ log_cmd_output " which codesign" " codesign 路径"
941
+ log_cmd_output " ls -la \" $CURSOR_APP_PATH \" " " Cursor 应用信息"
942
+
884
943
# 新增环境检查
885
944
if [[ $( uname) != " Darwin" ]]; then
886
945
log_error " 本脚本仅支持 macOS 系统"
887
946
exit 1
888
947
fi
889
948
890
-
891
949
clear
892
950
# 显示 Logo
893
951
echo -e "
@@ -972,7 +1030,15 @@ main() {
972
1030
# 显示最后的提示信息
973
1031
show_follow_info
974
1032
1033
+ # 记录脚本完成信息
1034
+ log_info " 脚本执行完成"
1035
+ echo " ========== Cursor ID 修改工具日志结束 $( date) ==========" >> " $LOG_FILE "
975
1036
1037
+ # 显示日志文件位置
1038
+ echo
1039
+ log_info " 详细日志已保存到: $LOG_FILE "
1040
+ echo " 如遇问题请将此日志文件提供给开发者以协助排查"
1041
+ echo
976
1042
}
977
1043
978
1044
# 执行主函数
0 commit comments