Windows 使用 Cursor 远程开发完整记录

从被控机安装 OpenSSH,到公钥免密,再到 Cursor 连接与 Server 手动安装排错的全过程。


目录

  1. 角色与环境
  2. 安装 sshd
  3. 密码测试
  4. 生成密钥
  5. scp 公钥到被控机
  6. 写入 administrators_authorized_keys
  7. BatchMode 验证
  8. SSH config
  9. Cursor 连接
  10. Cursor Server 下载失败与手动安装
  11. 排错
  12. 验收清单(DoD)
  13. 路径速查
  14. 一句话流程

1. 角色与环境

角色 说明 示例
控制端 本机,安装 Cursor,发起连接 用户 Lenovo,如 192.168.1.191
被控端 远程 Win10,跑 OpenSSH Server 用户 LENOVO,如 192.168.1.173

前提:同一局域网;被控机防火墙放行 TCP 22

实测环境:

项目
SSH Host 名 win10-173
被控端 IP 192.168.1.173
被控端用户 LENOVO(Administrators 组成员)
密钥 id_ed25519_win173 / .pub
Server commit(以日志为准,会变) aac81804b986d739acab348ed96b8bea6e83cc50

CMD 与 PowerShell

  • SSH 登录 Win10 默认常是 CMD(提示符 C:\Users\LENOVO>):不能写 $COMMIT = ...
  • 要用 $变量:先执行 powershell,看到 PS C:\...>
  • PowerShell 提示符变成 >>:说明多行粘贴未结束,先 Ctrl+C,再逐条执行。

2. 安装 sshd

在被控 Win10,以管理员身份打开 PowerShell:

Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Server*'
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

Start-Service sshd
Set-Service -Name sshd -StartupType Automatic

Get-Service sshd
netstat -an | findstr ":22"

期望:sshd = Running0.0.0.0:22 = LISTENING

可选防火墙规则:

New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22

3. 密码测试

控制端:

ssh LENOVO@192.168.1.173

输入密码能进远端 shell,说明网络与 sshd 正常,然后 exit

Cursor Remote SSH 必须公钥免密。密码 + Askpass 在管道里易出现 120s without receiving any data


4. 生成密钥

控制端:

ssh-keygen -t ed25519 -f %USERPROFILE%\.ssh\id_ed25519_win173 -C "cursor-win173"

得到:

  • 私钥:C:\Users\Lenovo\.ssh\id_ed25519_win173
  • 公钥:C:\Users\Lenovo\.ssh\id_ed25519_win173.pub

可不设密码短语,便于 Cursor 无人值守。


5. scp 公钥到被控机

控制端:

scp %USERPROFILE%\.ssh\id_ed25519_win173.pub LENOVO@192.168.1.173:C:\Users\LENOVO\id_ed25519_win173.pub

看到 100% 即传输成功。此时公钥只在用户目录,尚不能免密


6. 写入 administrators_authorized_keys

关键点

LENOVO 若是管理员组,Windows OpenSSH 不读

C:\Users\LENOVO\.ssh\authorized_keys

而读:

C:\ProgramData\ssh\administrators_authorized_keys

未写该文件时常见:

  • Connection reset by authenticating user ... [preauth]
  • Permission denied (publickey,password,keyboard-interactive)(BatchMode)

被控端操作(管理员 PowerShell,逐条)

Stop-Service sshd -Force
Get-Content "C:\Users\LENOVO\id_ed25519_win173.pub"

应有一行 ssh-ed25519 AAAA...

Get-Content "C:\Users\LENOVO\id_ed25519_win173.pub" | Set-Content "C:\ProgramData\ssh\administrators_authorized_keys" -Encoding ascii
icacls "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r
icacls "C:\ProgramData\ssh\administrators_authorized_keys" /grant "Administrators:F"
icacls "C:\ProgramData\ssh\administrators_authorized_keys" /grant "SYSTEM:F"
Get-Content "C:\ProgramData\ssh\administrators_authorized_keys"
Start-Service sshd
Get-Service sshd

权限只能是 Administrators + SYSTEM,继承打开会导致公钥被拒绝。

若是非管理员用户,则写入:

C:\Users\<用户>\.ssh\authorized_keys

7. BatchMode 验证

控制端(必须通过):

ssh -i %USERPROFILE%\.ssh\id_ed25519_win173 -o IdentitiesOnly=yes -o BatchMode=yes LENOVO@192.168.1.173 "echo OK"

成功:直接输出 OK,无密码提示。

BatchMode=yes = 禁止交互密码;过关后 Cursor 才稳。


8. SSH config

编辑控制端:C:\Users\Lenovo\.ssh\config

Host win10-173
    HostName 192.168.1.173
    User LENOVO
    IdentityFile ~/.ssh/id_ed25519_win173
    IdentitiesOnly yes

验证:

ssh win10-173 "echo OK"

9. Cursor 连接

  1. 打开 Cursor
  2. Ctrl+Shift+PRemote-SSH: Connect to Host…
  3. win10-173(不要写 LENOVO@192.168.1.173
  4. 首次选平台:Windows
  5. 打开远程文件夹,如 C:\Users\LENOVO
要做 不要做
连 Host 名 win10-173 user@ip
BatchMode 已 OK 依赖密码弹窗
平台选 Windows 误选 Linux(会找 bash

首次连接会在被控机安装 Cursor Server。若被控机访问不了 Azure,会卡在下载(见下一节)。


10. Cursor Server 下载失败与手动安装

现象(SSH 已通,装 Server 失败)

日志 含义
'bash' 不是内部或外部命令 误用 Linux 脚本;选 Windows
Configuring Cursor Server on Remote SSH 成功,开始装 Server
Downloading from https://cursor.blob.core.windows.net/.../vscode-reh-win32-x64.tar.gz 被控机自行下载
Download failed / 操作已超时 / 远程主机强制关闭连接 被控机访问 Azure 失败
Failed to install server within the timeout 下载超时
cursor-remote.lock ... 正被另一进程使用 上次失败残留锁
Test-Path node.exe = False,但子目录有 node.exe 解压多了一层目录

结论:免密 SSH 成功后,最常见卡点是 Server 包下载。

方案 A(推荐):控制端下载 → scp → 被控机解压

COMMIT 以 Cursor 日志为准(示例):

aac81804b986d739acab348ed96b8bea6e83cc50

下载地址:

https://cursor.blob.core.windows.net/remote-releases/aac81804b986d739acab348ed96b8bea6e83cc50/vscode-reh-win32-x64.tar.gz

目标目录:

C:\Users\LENOVO\.cursor-server\bin\win32-x64\<COMMIT>\

该目录下必须有 node.exe(约 80MB+),不能再套一层 vscode-reh-win32-x64\

A1. 控制端下载

浏览器打开上面 URL(比 PowerShell 更稳),或:

$COMMIT = "aac81804b986d739acab348ed96b8bea6e83cc50"
$url = "https://cursor.blob.core.windows.net/remote-releases/$COMMIT/vscode-reh-win32-x64.tar.gz"
Invoke-WebRequest -Uri $url -OutFile "$env:USERPROFILE\Downloads\vscode-reh-win32-x64.tar.gz"

PowerShell 必须$COMMIT / $url Invoke-WebRequest。整段倒序粘贴会报 Uri 为 Null。

检查大小(约 90MB;几 KB 则是失败页):

dir %USERPROFILE%\Downloads\vscode-reh-win32-x64.tar.gz

注意:VSCodeUserSetup-*.exe 不是 Cursor Server 包。

A2. 传到被控机
scp %USERPROFILE%\Downloads\vscode-reh-win32-x64.tar.gz win10-173:C:\Users\LENOVO\vscode-reh-win32-x64.tar.gz
A3. 被控机清锁并解压

若有残留锁:

taskkill /F /IM node.exe /T
del /F /Q "C:\Users\LENOVO\.cursor-server\bin\win32-x64\aac81804b986d739acab348ed96b8bea6e83cc50\cursor-remote.lock"

PowerShell:

$COMMIT = "aac81804b986d739acab348ed96b8bea6e83cc50"
$dest = "C:\Users\LENOVO\.cursor-server\bin\win32-x64\$COMMIT"
New-Item -ItemType Directory -Force -Path $dest | Out-Null
Remove-Item "$dest\cursor-remote.lock" -Force -ErrorAction SilentlyContinue
tar -xzf "C:\Users\LENOVO\vscode-reh-win32-x64.tar.gz" -C $dest

压缩包常会多一层 vscode-reh-win32-x64\,需上提:

$inner = Join-Path $dest "vscode-reh-win32-x64"
if (Test-Path $inner) {
    Move-Item "$inner\*" $dest -Force
    Remove-Item $inner -Recurse -Force
}
Remove-Item "$dest\cursor-remote.lock","$dest\cursor-server.tar.gz" -Force -ErrorAction SilentlyContinue
Test-Path "$dest\node.exe"

必须输出 True

纯 CMD(SSH 默认环境):

mkdir "C:\Users\LENOVO\.cursor-server\bin\win32-x64\aac81804b986d739acab348ed96b8bea6e83cc50"
tar -xzf "C:\Users\LENOVO\vscode-reh-win32-x64.tar.gz" -C "C:\Users\LENOVO\.cursor-server\bin\win32-x64\aac81804b986d739acab348ed96b8bea6e83cc50"
cd /d "C:\Users\LENOVO\.cursor-server\bin\win32-x64\aac81804b986d739acab348ed96b8bea6e83cc50"
xcopy /E /Y /I "vscode-reh-win32-x64\*" .
rmdir /S /Q "vscode-reh-win32-x64"
del /F /Q cursor-remote.lock cursor-server.tar.gz
dir node.exe
A4. 再连 Cursor

关掉失败的远程窗口 → Connect to Host → win10-173。已装好时应跳过下载。

方案 B:被控机代理

配置 HTTP_PROXY / HTTPS_PROXY 后让 Cursor 自动下载。

方案 C:加大超时

仅缓解「慢」,解决不了「完全下不动」。网络不通仍用方案 A。

升级 Cursor 后

Server 的 COMMIT 会变。从失败日志复制新 URL 中的 commit,按方案 A 再装一份。


11. 排错

OpenSSH 日志

Win10 默认没有 C:\ProgramData\ssh\logs\sshd.log。用事件日志:

Get-WinEvent -LogName "OpenSSH/Operational" -MaxEvents 20 | Format-List TimeCreated, Message
日志 说明
Accepted password 密码登录成功
Accepted publickey 公钥成功(目标)
Connection reset ... [preauth] 公钥未生效等
Server listening on 0.0.0.0 port 22 正在监听

详细调试:

ssh -vvv -i %USERPROFILE%\.ssh\id_ed25519_win173 -o IdentitiesOnly=yes -o BatchMode=yes LENOVO@192.168.1.173 "echo OK"

常见问题对照

现象 原因 处理
密码能登,BatchMode 失败 管理员公钥路径/权限错 第 6 节
administrators_authorized_keys 不存在 未创建 第 6 节
Cursor 120s without receiving any data 密码/Askpass 先 BatchMode OK,连 Host 名
'bash' 不是内部或外部命令 平台选成 Linux 选 Windows
$COMMIT 不是内部命令 在 CMD 里跑了 PowerShell powershell,或用纯 CMD
$url 为 Null 命令粘贴倒序 先赋值再 Invoke-WebRequest
Download failed / 超时 被控机访问不了 Azure 第 10 节手动安装
node.exe 在子目录 多一层解压目录 上提内容到 commit 目录
cursor-remote.lock 被占用 上次安装未结束 taskkill + 删 lock
Connection timed out 关机/换网/防火墙 ssh win10-173 "echo OK"
PowerShell >> 多行未结束 Ctrl+C,逐条执行
Stop-Service 权限不足 非管理员窗口 管理员 PowerShell

12. 验收清单(DoD)

SSH / 免密

  • 被控端 sshd Running,:22 LISTENING
  • 控制端密码 SSH 能登录
  • 已生成 id_ed25519_win173
  • 公钥已写入 administrators_authorized_keys + icacls
  • BatchMode=yes 输出 OK
  • ~/.ssh/configHost win10-173

Cursor Server / 连接

  • 控制端已下载 vscode-reh-win32-x64.tar.gz(约 90MB)
  • 已 scp 到被控机并解压
  • ...\aac81804...\node.exe 存在且约 80MB+(已上提,无多余子目录)
  • 已清 cursor-remote.lock
  • Cursor Connect to Host → win10-173 成功打开远程文件夹

13. 路径速查

用途 路径
控制端私钥 C:\Users\Lenovo\.ssh\id_ed25519_win173
控制端公钥 C:\Users\Lenovo\.ssh\id_ed25519_win173.pub
控制端 SSH config C:\Users\Lenovo\.ssh\config
被控端临时公钥 C:\Users\LENOVO\id_ed25519_win173.pub
管理员授权文件 C:\ProgramData\ssh\administrators_authorized_keys
sshd 配置 C:\ProgramData\ssh\sshd_config
OpenSSH 事件日志 事件查看器 → OpenSSH → Operational
Cursor Server 根 C:\Users\LENOVO\.cursor-server
当前版本目录 C:\Users\LENOVO\.cursor-server\bin\win32-x64\<COMMIT>\
关键文件 ...\node.exe
锁文件 ...\cursor-remote.lock

与其他设备:

Host 目标 用途
win10-173 Win10 @ 192.168.1.173 Windows 远程开发
yoho-pi5 Orange Pi @ 192.168.1.247 Linux 板子

原则相同:Host 名 + 公钥免密 + Cursor 连 Host,不连 user@ip

Keil 等强 GUI 工具建议 RDP;Cursor Remote SSH 适合编辑、终端、文件管理。


14. 一句话流程

装 sshd
  → 密码测通
  → 生成密钥并 scp 公钥
  → 管理员写入 administrators_authorized_keys + icacls
  → BatchMode 测 OK
  → config 写 Host win10-173
  → Cursor 选 Windows、连 Host 名
  → 若被控机下不了 Server:本机下载 tar.gz → scp → 解压并上提目录 → 确认 node.exe → 清锁 → 重连

两个核心坑:

  1. 管理员用户公钥必须写在 C:\ProgramData\ssh\administrators_authorized_keys
  2. Cursor Server 必须手动放到 ...\bin\win32-x64\<COMMIT>\node.exe(解压多一层要上提;CMD 里不要用 $ 变量)。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐