@ -134,26 +134,6 @@ check_and_kill_cursor() {
exit 1
}
# 备份系统 ID
backup_system_id( ) {
log_info "正在备份系统 ID..."
local system_id_file = " $BACKUP_DIR /system_id.backup_ $( date +%Y%m%d_%H%M%S) "
# 获取并备份 IOPlatformExpertDevice 信息
{
echo "# Original System ID Backup" > " $system_id_file "
echo "## IOPlatformExpertDevice Info:" >> " $system_id_file "
ioreg -rd1 -c IOPlatformExpertDevice >> " $system_id_file "
chmod 444 " $system_id_file "
chown " $CURRENT_USER " " $system_id_file "
log_info " 系统 ID 已备份到: $system_id_file "
} || {
log_error "备份系统 ID 失败"
return 1
}
}
# 备份配置文件
backup_config( ) {
if [ ! -f " $STORAGE_FILE " ] ; then
@ -246,86 +226,61 @@ modify_or_add_config() {
# 生成新的配置
generate_new_config( ) {
# 修改系统 ID
log_info "正在修改系统 ID..."
echo "[CONFIG] 开始修改系统 ID" >> " $LOG_FILE "
# 备份当前系统 ID
backup_system_id
# 生成新的系统 UUID
local new_system_uuid = $( uuidgen)
echo " [CONFIG] 生成新的系统 UUID: $new_system_uuid " >> " $LOG_FILE "
# 修改系统 UUID
sudo nvram SystemUUID = " $new_system_uuid "
echo "[CONFIG] 已设置系统 UUID" >> " $LOG_FILE "
printf " ${ YELLOW } 系统 UUID 已更新为: $new_system_uuid ${ NC } \n "
printf " ${ YELLOW } 请重启系统以使更改生效 ${ NC } \n "
# 将 auth0|user_ 转换为字节数组的十六进制
local prefix_hex = $( echo -n "auth0|user_" | xxd -p)
local random_part = $( generate_random_id)
local machine_id = " ${ prefix_hex } ${ random_part } "
local mac_machine_id = $( generate_random_id)
local device_id = $( generate_uuid | tr '[:upper:]' '[:lower:]' )
local sqm_id = " { $( generate_uuid | tr '[:lower:]' '[:upper:]' ) } "
echo "[CONFIG] 生成的 ID:" >> " $LOG_FILE "
echo " [CONFIG] machine_id: $machine_id " >> " $LOG_FILE "
echo " [CONFIG] mac_machine_id: $mac_machine_id " >> " $LOG_FILE "
echo " [CONFIG] device_id: $device_id " >> " $LOG_FILE "
echo " [CONFIG] sqm_id: $sqm_id " >> " $LOG_FILE "
log_info "正在修改配置文件..."
# 检查配置文件是否存在
if [ ! -f " $STORAGE_FILE " ] ; then
log_error " 未找到配置文件: $STORAGE_FILE "
log_warn "请先安装并运行一次 Cursor 后再使用此脚本"
exit 1
fi
# 确保配置文件目录存在
mkdir -p " $( dirname " $STORAGE_FILE " ) " || {
log_error "无法创建配置目录"
exit 1
}
# 如果文件不存在,创建一个基本的 JSON 结构
if [ ! -s " $STORAGE_FILE " ] ; then
echo '{}' > " $STORAGE_FILE " || {
log_error "无法初始化配置文件"
exit 1
}
fi
echo
log_warn "机器码重置选项"
# 修改现有文件
modify_or_add_config "telemetry.machineId" " $machine_id " " $STORAGE_FILE " || exit 1
modify_or_add_config "telemetry.macMachineId" " $mac_machine_id " " $STORAGE_FILE " || exit 1
modify_or_add_config "telemetry.devDeviceId" " $device_id " " $STORAGE_FILE " || exit 1
modify_or_add_config "telemetry.sqmId" " $sqm_id " " $STORAGE_FILE " || exit 1
# 使用菜单选择函数询问用户是否重置机器码
select_menu_option "是否需要重置机器码? (通常情况下,只修改js文件即可):" "不重置 - 仅修改js文件即可|重置 - 同时修改配置文件和机器码" 0
reset_choice = $?
# 设置文件权限和所有者
chmod 444 " $STORAGE_FILE " # 改为只读权限
chown " $CURRENT_USER " " $STORAGE_FILE "
# 记录日志以便调试
echo " [INPUT_DEBUG] 机器码重置选项选择: $reset_choice " >> " $LOG_FILE "
# 验证权限设置
if [ -w " $STORAGE_FILE " ] ; then
log_warn "无法设置只读权限,尝试使用其他方法..."
chattr +i " $STORAGE_FILE " 2>/dev/null || true
# 处理用户选择 - 索引0对应"不重置"选项,索引1对应"重置"选项
if [ " $reset_choice " = "1" ] ; then
log_info "您选择了重置机器码"
# 确保配置文件目录存在
if [ -f " $STORAGE_FILE " ] ; then
log_info " 发现已有配置文件: $STORAGE_FILE "
# 备份现有配置(以防万一)
backup_config
# 生成并设置新的设备ID
local new_device_id = $( generate_uuid)
local new_machine_id = " auth0|user_ $( openssl rand -hex 16) "
log_info "正在设置新的设备和机器ID..."
log_debug " 新设备ID: $new_device_id "
log_debug " 新机器ID: $new_machine_id "
# 修改配置文件
if modify_or_add_config "deviceId" " $new_device_id " " $STORAGE_FILE " && \
modify_or_add_config "machineId" " $new_machine_id " " $STORAGE_FILE " ; then
log_info "配置文件修改成功"
else
log_error "配置文件修改失败"
fi
else
log_warn "未找到配置文件,这是正常的,脚本将跳过ID修改"
fi
else
log_info "成功设置文件只读权限"
log_info "您选择了不重置机器码,将仅修改js文件"
# 确保配置文件目录存在
if [ -f " $STORAGE_FILE " ] ; then
log_info " 发现已有配置文件: $STORAGE_FILE "
# 备份现有配置(以防万一)
backup_config
else
log_warn "未找到配置文件,这是正常的,脚本将跳过ID修改"
fi
fi
echo
log_info " 已更新配置: $STORAGE_FILE "
log_debug " machineId: $machine_id "
log_debug " macMachineId: $mac_machine_id "
log_debug " devDeviceId: $device_id "
log_debug " sqmId: $sqm_id "
log_info "配置处理完成"
}
# 清理 Cursor 之前的修改
@ -377,8 +332,9 @@ modify_cursor_app_files() {
return 1
fi
# 定义目标文件
# 定义目标文件 - 将extensionHostProcess.js放在最前面优先处理
local target_files = (
" ${ CURSOR_APP_PATH } /Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js "
" ${ CURSOR_APP_PATH } /Contents/Resources/app/out/main.js "
" ${ CURSOR_APP_PATH } /Contents/Resources/app/out/vs/code/node/cliProcessMain.js "
)
@ -497,9 +453,10 @@ modify_cursor_app_files() {
fi
done
# 修改目标文件
# 修改目标文件 - 优先处理js文件
local modified_count = 0
local files = (
" ${ temp_app } /Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js "
" ${ temp_app } /Contents/Resources/app/out/main.js "
" ${ temp_app } /Contents/Resources/app/out/vs/code/node/cliProcessMain.js "
)
@ -527,7 +484,45 @@ modify_cursor_app_files() {
}
# 使用 sed 替换而不是字符串操作
if grep -q "IOPlatformUUID" " $file " ; then
if [ [ " $file " = = *"extensionHostProcess.js" * ] ] ; then
log_debug "处理 extensionHostProcess.js 文件..."
echo "[PROCESS_DETAIL] 开始处理 extensionHostProcess.js 文件" >> " $LOG_FILE "
# 检查是否包含目标代码
if grep -q 'i.header.set("x-cursor-checksum' " $file " ; then
log_debug "找到 x-cursor-checksum 设置代码"
echo "[FOUND] 找到 x-cursor-checksum 设置代码" >> " $LOG_FILE "
# 记录匹配的行到日志
grep -n 'i.header.set("x-cursor-checksum' " $file " >> " $LOG_FILE "
# 执行特定的替换
if sed -i.tmp 's/i\.header\.set("x-cursor-checksum",e===void 0?`${p}${t}`:`${p}${t}\/${e}`)/i.header.set("x-cursor-checksum",e===void 0?`${p}${t}`:`${p}${t}\/${p}`)/' " $file " ; then
log_info "成功修改 x-cursor-checksum 设置代码"
echo "[SUCCESS] 成功完成 x-cursor-checksum 设置代码替换" >> " $LOG_FILE "
# 记录修改后的行
grep -n 'i.header.set("x-cursor-checksum' " $file " >> " $LOG_FILE "
( ( modified_count++) )
log_info " 成功修改文件: ${ file / $temp_dir \/ / } "
else
log_error "修改 x-cursor-checksum 设置代码失败"
echo "[ERROR] 替换 x-cursor-checksum 设置代码失败" >> " $LOG_FILE "
cp " ${ file } .bak " " $file "
fi
else
log_warn "未找到 x-cursor-checksum 设置代码"
echo "[FILE_CHECK] 未找到 x-cursor-checksum 设置代码" >> " $LOG_FILE "
# 记录文件部分内容到日志以便排查
echo "[FILE_CONTENT] 文件中包含 'header.set' 的行:" >> " $LOG_FILE "
grep -n "header.set" " $file " | head -20 >> " $LOG_FILE "
echo "[FILE_CONTENT] 文件中包含 'checksum' 的行:" >> " $LOG_FILE "
grep -n "checksum" " $file " | head -20 >> " $LOG_FILE "
fi
echo "[PROCESS_DETAIL] 完成处理 extensionHostProcess.js 文件" >> " $LOG_FILE "
elif grep -q "IOPlatformUUID" " $file " ; then
log_debug "找到 IOPlatformUUID 关键字"
echo "[FOUND] 找到 IOPlatformUUID 关键字" >> " $LOG_FILE "
grep -n "IOPlatformUUID" " $file " | head -5 >> " $LOG_FILE "
@ -836,98 +831,6 @@ disable_auto_update() {
log_info "完成后请重启 Cursor"
}
# 生成随机MAC地址
generate_random_mac( ) {
# 生成随机MAC地址,保持第一个字节的第二位为0(保证是单播地址)
printf '02:%02x:%02x:%02x:%02x:%02x' $(( RANDOM%256)) $(( RANDOM%256)) $(( RANDOM%256)) $(( RANDOM%256)) $(( RANDOM%256))
}
# 获取网络接口列表
get_network_interfaces( ) {
networksetup -listallhardwareports | awk '/Hardware Port|Ethernet Address/ {print $NF}' | paste - - | grep -v 'N/A'
}
# 备份MAC地址
backup_mac_addresses( ) {
log_info "正在备份MAC地址..."
local backup_file = " $BACKUP_DIR /mac_addresses.backup_ $( date +%Y%m%d_%H%M%S) "
{
echo " # Original MAC Addresses Backup - $( date) " > " $backup_file "
echo "## Network Interfaces:" >> " $backup_file "
networksetup -listallhardwareports >> " $backup_file "
chmod 444 " $backup_file "
chown " $CURRENT_USER " " $backup_file "
log_info " MAC地址已备份到: $backup_file "
} || {
log_error "备份MAC地址失败"
return 1
}
}
# 修改MAC地址
modify_mac_address( ) {
log_info "正在获取网络接口信息..."
# 备份当前MAC地址
backup_mac_addresses
# 获取所有网络接口
local interfaces = $( get_network_interfaces)
if [ -z " $interfaces " ] ; then
log_error "未找到可用的网络接口"
return 1
fi
echo
log_info "发现以下网络接口:"
echo " $interfaces " | nl -w2 -s') '
echo
echo -n "请选择要修改的接口编号 (按回车跳过): "
read -r choice
if [ -z " $choice " ] ; then
log_info "跳过MAC地址修改"
return 0
fi
# 获取选择的接口名称
local selected_interface = $( echo " $interfaces " | sed -n " ${ choice } p " | awk '{print $1}' )
if [ -z " $selected_interface " ] ; then
log_error "无效的选择"
return 1
fi
# 生成新的MAC地址
local new_mac = $( generate_random_mac)
log_info " 正在修改接口 $selected_interface 的MAC地址... "
# 关闭网络接口
sudo ifconfig " $selected_interface " down || {
log_error "无法关闭网络接口"
return 1
}
# 修改MAC地址
if sudo ifconfig " $selected_interface " ether " $new_mac " ; then
# 重新启用网络接口
sudo ifconfig " $selected_interface " up
log_info " 成功修改MAC地址为: $new_mac "
echo
log_warn "请注意: MAC地址修改可能需要重新连接网络才能生效"
else
log_error "修改MAC地址失败"
# 尝试恢复网络接口
sudo ifconfig " $selected_interface " up
return 1
fi
}
# 新增恢复功能选项
restore_feature( ) {
# 检查备份目录是否存在
@ -1128,85 +1031,35 @@ main() {
╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝
"
echo -e " ${ BLUE } ================================ ${ NC } "
echo -e " ${ GREEN } Cursor 设备ID 修改 工具 ${ NC } "
echo -e " ${ GREEN } Cursor 启动 工具 ${ NC } "
echo -e " ${ YELLOW } 关注公众号【煎饼果子卷AI】 ${ NC } "
echo -e " ${ YELLOW } 一起交流更多Cursor技巧和AI知识(脚本免费、关注公众号加群有更多技巧和大佬) ${ NC } "
echo -e " ${ BLUE } ================================ ${ NC } "
echo
echo -e " ${ YELLOW } [重要提示] ${ NC } 本工具支持 Cursor v0.47.x "
echo -e " ${ YELLOW } [重要提示] ${ NC } 本工具优先修改js文件,更加安全可靠 "
echo -e " ${ YELLOW } [重要提示] ${ NC } 本工具免费,如果对您有帮助,请关注公众号【煎饼果子卷AI】 "
echo
# 删除开头的修复选项部分,直接 执行主要功能
# 执行主要功能
check_permissions
check_and_kill_cursor
backup_config
generate_new_config
# 询问用户是否要修改主程序文件
echo
log_warn "是否要修改 Cursor 主程序文件?"
# 使用新的菜单选择函数
select_menu_option "请使用上下箭头选择,按Enter确认:" "否 - 仅修改配置文件 (更安全但可能需要更频繁地重置)|是 - 同时修改主程序文件 (更持久但有小概率导致程序不稳定)" 1
app_choice = $?
# 记录到日志
echo " [INPUT_DEBUG] 读取到的选择: $app_choice " >> " $LOG_FILE "
# 确保脚本不会因为输入问题而终止
set +e
# 处理用户选择
if [ " $app_choice " = "0" ] ; then
log_info "您选择了跳过主程序文件修改"
log_info "已跳过主程序文件修改"
else
# 默认或输入1都执行修改
log_info "正在执行主程序文件修改..."
# 使用子shell执行修改,避免错误导致整个脚本退出
(
if modify_cursor_app_files; then
log_info "主程序文件修改成功!"
else
log_warn "主程序文件修改失败,但配置文件修改可能已成功"
log_warn "如果重启后 Cursor 仍然提示设备被禁用,请重新运行此脚本"
fi
)
fi
# 恢复错误处理
set -e
# 添加MAC地址修改选项
echo
log_warn "是否要修改MAC地址?"
# 使用新的菜单选择函数
select_menu_option "请使用上下箭头选择,按Enter确认:" "否 - 保持默认设置|是 - 修改MAC地址 (推荐)" 1
mac_choice = $?
# 记录到日志
echo " [INPUT_DEBUG] MAC地址选择: $mac_choice " >> " $LOG_FILE "
# 询问用户是否需要重置机器码(默认不重置)
generate_new_config
# 确保脚本不会因为输入问题而终止
set +e
# 执行主程序文件修改
log_info "正在执行主程序文件修改..."
# 处理用户选择 - 索引1对应"是"选项
if [ " $mac_choice " = "1" ] ; then
log_info "您选择了修改MAC地址"
# 使用子shell执行修改,避免错误导致整个脚本退出
(
if modify_mac_address; then
log_info "MAC地址修改完成!"
else
log_error "MAC地址修改失败"
fi
)
else
log_info "已跳过MAC地址修改"
fi
# 使用子shell执行修改,避免错误导致整个脚本退出
(
if modify_cursor_app_files; then
log_info "主程序文件修改成功!"
else
log_warn "主程序文件修改失败,但配置文件修改可能已成功"
log_warn "如果重启后 Cursor 仍然提示设备被禁用,请重新运行此脚本"
fi
)
# 恢复错误处理
set -e
@ -1219,9 +1072,6 @@ main() {
log_info "请重启 Cursor 以应用新的配置"
# 新增恢复功能选项
#restore_feature
# 显示最后的提示信息
show_follow_info