You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
11 KiB
11 KiB
Cursor 清理环境、修改机器码、换号 全面指南(含伪代码)
本指南对项目中涉及 Cursor 的“清理环境”“修改机器码”“换号”等能力进行系统化总结,基于本仓库已有的 Go CLI 与跨平台脚本(Windows PowerShell、macOS/Linux Bash)的实现思路,整理为可复用的伪代码与操作流程,便于嵌入到任何自动化工具或二次开发中。
适用范围:
- 系统:Windows / macOS / Linux(x64/ARM)
- Cursor 版本:1.0.x 系列(以及多数相近结构版本)
- 能力:
- 自动关闭 Cursor 进程
- 清理缓存与配置目录(可选分级:轻度清理/重置试用/彻底清理)
- 修改/刷新“机器码”(storage.json 内的 telemetry.* 字段)
- Windows 额外支持 MachineGuid 注册表备份与修改(脚本实现)
- 可选:通过内核 JS 注入方式劫持设备指纹读取路径
- 账号切换(换号)流程与注意事项
一、关键路径与文件
-
配置文件(storage.json):
- Windows: %APPDATA%\Cursor\User\globalStorage\storage.json
- macOS: ~/Library/Application Support/Cursor/User/globalStorage/storage.json
- Linux: ~/.config/Cursor/User/globalStorage/storage.json
-
可能的本地目录(清理对象):
- Windows:
- %APPDATA%\Cursor
- %USERPROFILE%.cursor
- %LOCALAPPDATA%\cursor-updater(可删除并创建同名空文件阻止更新)
- macOS:
- ~/Library/Application Support/Cursor
- ~/.cursor
- 可选:~/Library/Caches/Cursor(若存在)
- Linux:
- ~/.config/Cursor
- ~/.cursor
- Windows:
-
可选的应用资源(用于 JS 注入劫持,版本差异较大):
- Windows: %LOCALAPPDATA%\Programs\Cursor\resources\app\out...
- macOS: /Applications/Cursor.app/Contents/Resources/app/out/...
- Linux: 通常在安装目录下的 resources/app/out/...
-
storage.json 需关注的字段:
- telemetry.machineId
- telemetry.macMachineId
- telemetry.devDeviceId
- telemetry.sqmId
二、跨平台统一主流程伪代码
function main(mode):
ensure_admin_or_sudo()
ui.clear_screen_and_logo()
kill_cursor_processes() # 多次重试 + 温和关闭 -> 强杀
if mode.includes("CLEAN"):
cleanup_environment(level=mode.cleanup_level)
repair_permissions_if_needed() # macOS 常见
config_path = resolve_storage_json_path()
old_config = try_read_json(config_path) or {}
new_ids = {
machineId: gen_machine_id(), # "auth0|user_" + 64 hex
macMachineId: gen_hex(64),
devDeviceId: gen_uuid(),
sqmId: old_config.get('telemetry.sqmId') or gen_uuid_braced()
}
backup_file = backup(config_path) # 写前备份
merged = merge(old_config, new_ids, lastModified=now_rfc3339())
atomic_write(config_path, json_indent(merged))
if mode.readonly:
chmod_readonly(config_path)
show_success_and_restart_tips()
说明:
- gen_machine_id/devDeviceId 等可直接参考 pkg/idgen 的实现逻辑(本仓库已提供)。
- atomic_write:先写 .tmp,再 chmod,最后 rename 保证落盘原子性(internal/config 中已有实现)。
- Windows 可选:在清理/重置环节增加注册表 MachineGuid 备份与替换(仅脚本实现,不在 Go 中直接做)。
三、环境清理(分级可选)
根据目标不同,可以设计三种强度:
- 轻度:仅关闭 Cursor + 刷新 storage.json 的 telemetry.* 字段
- 中度:附加删除试用状态关联目录(“防掉试用Pro”目录清理)
- 重度:全面清理 Cursor 相关用户目录与缓存,必要时恢复权限并重新冷启动一次以再生成配置
3.1 Windows 清理伪代码
function cleanup_windows(level):
dirs = [
"%APPDATA%/Cursor",
"%USERPROFILE%/.cursor"
]
if level == "HEAVY":
dirs += [
"%LOCALAPPDATA%/cursor-updater" # 删除后可创建同名空文件阻止自动更新
]
for d in dirs:
if exists(d): rm -rf d
if level == "HEAVY":
# 可选:阻止自动更新
ensure_file("%LOCALAPPDATA%/cursor-updater")
# 可选:刷新 DNS(网络相关问题)
run("ipconfig /flushdns")
3.2 macOS 清理与权限修复伪代码
function cleanup_macos(level):
dirs = [
"~/Library/Application Support/Cursor",
"~/.cursor"
]
if level == "HEAVY":
dirs += ["~/Library/Caches/Cursor"]
for d in dirs:
if exists(d): rm -rf d
# 常见:权限修复(避免 EACCES 等问题)
sudo_chown_recursive("~/Library/Application Support/Cursor", whoami)
sudo_chown_recursive("~/.cursor", whoami)
chmod_u_plus_w_recursive("~/Library/Application Support/Cursor")
chmod_u_plus_w_recursive("~/.cursor/extensions")
# 可选:重启 Cursor 一次并等待 15–30s 让 storage.json 生成,再立刻关闭
# restart_cursor_and_wait_generate_config()
3.3 Linux 清理伪代码
function cleanup_linux(level):
dirs = [
"~/.config/Cursor",
"~/.cursor"
]
for d in dirs:
if exists(d): rm -rf d
# 可选:重启 Cursor 并等待生成配置
# restart_cursor_and_wait_generate_config()
四、机器码(telemetry.*)刷新伪代码
function refresh_machine_ids(config_path):
cfg = try_read_json(config_path) or {}
new_machine_id = "auth0|user_" + random_hex(64) # 与脚本一致
new_mac_machineId = random_hex(64)
new_device_id = uuid_v4() # xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
new_sqm_id = cfg.get('telemetry.sqmId') or "{" + uuid_v4().upper() + "}"
cfg['telemetry.machineId'] = new_machine_id
cfg['telemetry.macMachineId'] = new_mac_machineId
cfg['telemetry.devDeviceId'] = new_device_id
cfg['telemetry.sqmId'] = new_sqm_id
cfg['lastModified'] = now_rfc3339()
atomic_write(config_path, json_indent(cfg))
备注:
- 与本仓库 pkg/idgen 的实现保持一致即可(Go 版本已提供;Shell/PS 在脚本中也有实现)。
五、Windows 额外项:注册表 MachineGuid(可选,脚本实现)
某些环境下,应用会读取 Windows 的 MachineGuid 进行设备识别。脚本可选提供如下流程:
function windows_modify_machine_guid():
key = "HKLM\\SOFTWARE\\Microsoft\\Cryptography"
name = "MachineGuid"
old = reg_query(key, name)
backup_path = "%APPDATA%/Cursor/User/globalStorage/backups/MachineGuid.backup_yyyyMMdd_HHmmss"
write_file(backup_path, old)
new_guid = uuid_v4().lower()
reg_set(key, name, new_guid)
# 回滚示例
# reg_set(key, name, read_file(backup_path))
注意:
- 需要管理员运行(UAC 提升)。
- 修改 MachineGuid 可能影响依赖该标识的部分软件授权或系统行为,务必先备份。
六、可选策略:内核 JS 注入劫持(进阶)
脚本中提供了通过修改应用 resources/app/out/*.js 的方式,注入代码来覆盖 crypto.randomUUID、设备 ID/MAC 读取函数,达到“临时劫持设备指纹”的目的。不同版本构建输出不同,需做兼容性判断与备份。
function patch_cursor_js(resources_root):
targets = [
"out/vs/workbench/api/node/extensionHostProcess.js",
"out/main.js",
"out/vs/code/node/cliProcessMain.js"
]
new_uuid = uuid_v4().lower()
machineId = "auth0|user_" + random_base62(32)
deviceId = uuid_v4().lower()
macId = random_hex(64)
inject = """
// injected by Cursor helper
import crypto from 'crypto';
const orig = crypto.randomUUID;
crypto.randomUUID = () => '""" + new_uuid + """';
globalThis.getMachineId = ()=>'""" + machineId + """';
globalThis.getDeviceId = ()=>'""" + deviceId + """';
globalThis.macMachineId = '""" + macId + """';
console.log('Cursor device id hijacked');
"""
for file in targets:
path = resources_root + "/resources/app/" + file
if exists(path):
content = read_file(path)
if not contains(content, "randomUUID()"): # 仅作为示例判定
backup(file)
write_file(path, inject + content)
注意:
- 该策略依赖构建产物形式,需注意版本差异并做好失败回滚。
- 不推荐作为首选,仅在“telemetry.* 刷新 + 彻底清理”仍无法满足时再考虑。
七、换号(账号切换)建议流程
function switch_account_flow():
in_app_sign_out() # 应用内退出登录
kill_cursor_processes()
cleanup_environment(level='MEDIUM')
refresh_machine_ids(resolve_storage_json_path())
# 网络侧建议(可选):更换干净IP节点、刷新 DNS
if on_windows(): run("ipconfig /flushdns")
if on_macos(): run("sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder")
if on_linux(): run("resolvectl flush-caches || systemd-resolve --flush-caches || true")
reopen_and_login_with_new_account()
要点:
- 最简可行路径:退出登录 + 刷新 telemetry.* + 重新登录。
- 若仍被限制,采用“中度/重度清理 + 刷新 telemetry.* + (可选)Windows MachineGuid + 更换网络”。
八、自动化脚本与模块化建议
本仓库已提供:
- Go CLI:关闭进程、读取与原子写入 storage.json、生成各类 ID、国际化文案与 TUI 反馈
- PowerShell(Windows):进程关闭、环境清理、storage.json 修改、MachineGuid 备份与写入、JS 注入
- Bash(macOS/Linux):进程关闭、权限修复、环境清理、storage.json 修改与回滚、AppImage 安装(Linux)
模块化拆分建议:
- process: 进程发现与关闭,带重试
- config: storage.json 解析、字段合并、原子写入、备份
- idgen: 生成 machineId/macMachineId/devDeviceId/sqmId
- platform: 按 OS 抽象路径与特权提升
- patches: 可选 JS 注入、禁用自动更新的策略
九、常见问题与排查
- storage.json 不存在:
- 冷启动 Cursor 一次并等待 15–30s,关闭后再写入
- EACCES/权限错误(macOS 常见):
- 参考上文权限修复四连:chown 两处 + chmod 两处
- 仍提示已达试用上限:
- 确认已重度清理 + 刷新 telemetry.* +(Windows)考虑 MachineGuid + 切换干净网络
- Cursor 自动更新导致回退失效:
- Windows 删除 %LOCALAPPDATA%/cursor-updater 并创建同名空文件
十、安全与回滚
- 所有修改均建议先备份(storage.json、MachineGuid 等)
- 配置写入采用原子写,避免部分写入导致损坏
- 提供回滚入口:
- storage.json:backups 目录保留历史
- Windows MachineGuid:注册表备份文件可手动恢复
参考实现位置(本仓库)
- Go 主程序:cmd/cursor-id-modifier/main.go
- 配置读写:internal/config/config.go(原子写、路径解析)
- 进程管理:internal/process/manager.go
- ID 生成:pkg/idgen/generator.go
- 脚本:scripts/run/
- Windows: cursor_win_id_modifier.ps1(含注册表、JS 注入、目录清理)
- macOS: cursor_mac_id_modifier.sh(含权限修复、目录清理、重启等待)
- Linux: cursor_linux_id_modifier.sh(含安装、目录清理)