# Windows 远程抓取环境配置 ## 连接方式 | 网络 | 地址 | 备注 | |------|------|------| | **外网(当前)** | `sshpass -p 'xxx' ssh -p 7022 sshadmin@8.152.213.143` | 通过内网穿透NAT端口转发,**当前唯一可用** | | 内网 | `sshadmin@192.168.100.176` | Windows内网IP,外部不可达 | | ~~旧内网~~ | `~~sshadmin@192.168.50.99~~` | **已失效**(2026-06-22 迁移后) | SSH 使用 sshpass 密码认证(无密钥认证)。`~/.ssh/config` 中配置了 `Host windows-hr` 别名。 ## 环境状态(截至 2025-05-20) - **环境状态(截至 2025-05-20)** - **Chrome:** ✅ 已安装(`C:\Program Files\Google\Chrome\Application\chrome.exe`) - **Node.js:** ✅ v22.18.0 + npm 10.9.3(MSI 静默安装) - **Playwright:** ✅ playwright-core(`npm install playwright-core`) - **better-sqlite3:** ✅(`npm install better-sqlite3`) - **工作目录:** `C:\recruitment\` - **数据库路径:** `C:\recruitment\recruitment.db`(从 Linux SCP 同步) - **脚本路径:** `C:\recruitment\zhaopin-scrape.js`(跨平台,通过 `RECRUITMENT_DB` 环境变量指定数据库路径) ## 已完成的部署步骤 ```powershell # 1. 安装 Node.js(MSI 静默安装) # 下载地址:https://nodejs.org/dist/v22.18.0/node-v22.18.0-x64.msi msiexec /i node-v22.18.0-x64.msi /quiet /norestart # 2. 创建工作目录 mkdir C:\recruitment cd C:\recruitment npm init -y # 3. 安装依赖 npm install playwright-core better-sqlite3 # 4. 部署数据库(从 Linux SCP) # Linux 端:scp ~/.hermes/data/recruitment/recruitment.db sshadmin@192.168.50.99:C:/recruitment/ # 5. 部署脚本(注意跨平台路径处理) # 脚本通过 process.env.RECRUITMENT_DB 获取数据库路径 # Windows 端设置:set RECRUITMENT_DB=C:\recruitment\recruitment.db ``` ## ✅ 已解决:SSH 会话隔离导致 CDP 端口不可达 ### 现象 Chrome 通过 SSH 会话以 `--remote-debugging-port=9222` 启动后: - `netstat -ano | findstr 9222` 显示端口 LISTENING ✅ - `curl http://127.0.0.1:9222/json/version` 连接失败 ❌ ### 根因 **Windows Session 隔离** — SSH 会话和 Chrome 进程运行在不同的 Windows 会话中,网络命名空间不共享。 ### ✅ 已验证的解决方案:RDP + SSH 端口转发 **实际使用的工作流程(已验证通过):** 1. 用户 RDP 登录 Windows 桌面 2. 在 Windows 桌面用快捷方式启动 Chrome(调试模式 + 独立 user-data-dir) 3. Linux 端建立 SSH 端口隧道:`ssh -N -L 9223:127.0.0.1:9222 sshadmin@192.168.50.99` 4. 脚本在 Linux 上运行,通过 `CDP_PORT=9223` 环境变量连接隧道端口 5. 数据直接写入 Linux 本地 SQLite 数据库,无需同步 **关键细节:** - 隧道端口用 9223 避免和 Linux 本地 9222 冲突 - Chrome 必须用 `--user-data-dir` 指定独立目录(默认目录被锁定,不能直接用) - SSH 隧道必须保持连接,断开就失效 - `headless` 模式下 CDP 端口可达,但推荐用桌面模式(用户可可视监控) ### ❌ 已验证无效的方案 | 方案 | 结果 | |------|------| | SSH 会话内 `start "" "chrome.exe" --remote-debugging-port=9222` | 进程不启动(session 隔离) | | SSH 会话内 `powershell Start-Process "chrome.exe" -ArgumentList ...` | 进程不启动(session 隔离) | | SSH 会话内直接执行 `chrome.exe --remote-debugging-port=9222` | 端口 LISTENING 但不可达 | | `curl http://127.0.0.1:9222/json/version`(SSH 会话内) | 连接失败 | | `--remote-allow-origins=*` | 无关,这是 CORS 配置 | ### ✅ 推荐:Windows 计划任务远程启动(2026-06-02 验证) **Windows 上已配置两个计划任务,可通过 SSH 远程启动浏览器(绕过 session 隔离):** ```bash # 启动 Chrome Debug(hr1,CDP 9222) sshpass -p 'xxx' ssh -p 7022 sshadmin@8.152.213.143 "schtasks /run /TN \"ChromeDebug\"" # 启动 Edge Debug(hr2,CDP 9224) sshpass -p 'xxx' ssh -p 7022 sshadmin@8.152.213.143 "schtasks /run /TN \"LaunchEdgeDebug\"" ``` **命令:** | 计划任务名 | 启动内容 | |-----------|---------| | `ChromeDebug` | `"C:\Program Files\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222` | | `LaunchEdgeDebug` | `"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" --remote-debugging-port=9224 --user-data-dir=C:\temp\edge-debug` | **原理:** 计划任务在桌面 session(Session 1)中执行,与 RDP 登录同 session,所以 GUI 进程能正常启动且 CDP 端口可达。`start` 和 `Start-Process` 通过 SSH(Session 0)执行,进程要么不启动要么 CDP 不可达。 **验证步骤(Edge 启动后需 ~6 秒才能 CDP 就绪):** ```bash sleep 6 ssh sshadmin@192.168.50.99 "curl -s --connect-timeout 5 http://127.0.0.1:9224/json/version" # 应返回 {"Browser":"Edg/148.0.3967.96",...,"webSocketDebuggerUrl":"ws://..."} ``` **Edge 启动后默认只打开空白 newtab 页**,需要通过 CDP 导航到推荐页或用户在桌面手动操作。 ## Edge 启动方式(双账号 hr2) ### 安装路径 ``` C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe ``` ### ⚠️ Windows 用户目录实际路径(2026-06-26 确认) 通过 SSH `echo %USERPROFILE%` 确认实际用户目录为 `C:\Users\sshadmin.WIN-3NKO8I5R9IJ`(不是 `C:\Users\sshadmin`)。 - Chrome user-data-dir 应检查是否也需要更新(当前配置为 `C:\temp\chrome-debug`) - Edge user-data-dir 需用完整路径:`C:\Users\sshadmin.WIN-3NKO8I5R9IJ\AppData\Local\Microsoft\Edge\UserData-hr2` - **路径中避免空格**(用 `UserData-hr2` 不用 `User Data hr2`),PowerShell `Start-Process -ArgumentList` 解析含空格路径时可能出错 ### 远程启动(推荐:schtasks) ```bash # 通过 SSH 用计划任务启动(绕过 session 隔离) sshpass -p 'xxx' ssh -p 7022 sshadmin@8.152.213.143 "schtasks /run /TN \"LaunchEdgeDebug\"" sleep 6 # Edge 启动较慢 ``` **⚠️ 计划任务 `LaunchEdgeDebug` 的 user-data-dir 可能需要更新:** 当前配置为 `C:\temp\edge-debug`,需在 Windows 上检查该目录是否还存在,必要时更新为 `C:\Users\sshadmin.WIN-3NKO8I5R9IJ\AppData\Local\Microsoft\Edge\UserData-hr2`。 ### ❌ SSH 远程启动 Edge(已确认无效,pitfalls #74) 通过 SSH 用 `powershell Start-Process` 或 `cmd /c start` 启动 Edge: - 进程可能启动(`tasklist` 可见 msedge.exe) - 端口可能短暂 LISTENING - 但 **CDP 端口不可达**(curl 返回空或连接失败) - 端口 LISTENING 后会自动释放(Edge 在 Session 0 中运行异常) - **即使是 `powershell Start-Process` 也会失败** — 2026-06-26 实测确认 **根因:** SSH 登录在 Session 0(services session),Edge 启动在 Session 0 而非桌面 Session 1。GUI 进程在 Session 0 中 CDP 端口不稳定,会短暂监听后释放。 **唯一可靠远程方式:`schtasks /run`**(计划任务在桌面 session 执行)。 ### 桌面快捷方式(备选) > ⚠️ **2026-06-02 发现:桌面无 Edge Debug.lnk 快捷方式**,只有 Chrome Debug.lnk。计划任务 `LaunchEdgeDebug` 是唯一远程启动方式。如需创建快捷方式: ```powershell $WshShell = New-Object -ComObject WScript.Shell $Shortcut = $WshShell.CreateShortcut("C:\Users\Administrator\Desktop\Edge Debug.lnk") $Shortcut.TargetPath = "C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe" $Shortcut.Arguments = "--remote-debugging-port=9224 --user-data-dir=C:\temp\edge-debug" $Shortcut.Save() ``` ### ⚠️ Edge 同样受 Windows Session 隔离限制 通过 SSH 会话远程 `Start-Process` 启动的 Edge,CDP 端口 9224 虽然显示 LISTENING 但**不可达**,和 Chrome 完全相同的问题。**必须通过计划任务或桌面快捷方式启动**。详见上方"已验证无效方案"章节。 ### 验证 CDP 连通性 ```bash # Linux 端,通过隧道验证 curl -s --connect-timeout 5 http://127.0.0.1:9225/json/version # 应返回 JSON,含 Browser 字段为 "Microsoft Edge/..." ``` ## Chrome 启动方式 ### 方式1:桌面快捷方式(推荐,已验证) 在 Windows 桌面创建快捷方式,用户双击启动: ```powershell # 通过 SSH 创建桌面快捷方式(一次性) $WshShell = New-Object -ComObject WScript.Shell $Shortcut = $WshShell.CreateShortcut('C:\Users\Administrator\Desktop\Chrome Debug.lnk') $Shortcut.TargetPath = 'C:\Program Files\Google\Chrome\Application\chrome.exe' $Shortcut.Arguments = '--remote-debugging-port=9222 --user-data-dir=C:\temp\chrome-debug' $Shortcut.Save() ``` **⚠️ user-data-dir 必须用独立目录:** Chrome 默认的 User Data 目录被已运行的 Chrome 实例锁定,直接使用会报错。必须先复制一份: ```powershell # 首次使用:复制默认 Chrome 配置(保留登录态和 Cookie) robocopy "C:\Users\Administrator\AppData\Local\Google\Chrome\User Data" "C:\temp\chrome-debug" /E ``` ### 方式2:SSH 命令行启动 ```powershell # headless 模式(SSH 会话内 CDP 端口可达,但用户看不到浏览器) & "C:\Program Files\Google\Chrome\Application\chrome.exe" --headless=new --remote-debugging-port=9222 --user-data-dir=C:\temp\chrome-debug ``` ## Linux 端操作 ```bash # 1. 建立 SSH 端口隧道(后台运行,保持连接) ssh -N -L 9223:127.0.0.1:9222 sshadmin@192.168.50.99 & # 2. 验证 CDP 连接 curl -s http://localhost:9223/json/version # 3. 运行抓取脚本(通过环境变量指定端口) cd /home/kt/scripts && CDP_PORT=9223 node zhaopin-scrape.js 20 ``` ## 数据存储 **当前方案:脚本在 Linux 运行,数据直接写入 Linux 本地数据库,无需同步。** - 数据库路径:`/home/kt/.hermes/data/recruitment/recruitment.db` - Windows 上不需要维护数据库副本 - 脚本通过 `RECRUITMENT_DB` 环境变量自动检测系统并使用对应路径(Linux 默认,Windows 通过环境变量覆盖) ## 网络环境限制(重要) **⚠️ Windows 机器无法插网线(用户确认 2026-06-01),WiFi 是唯一网络方式。** | 项目 | 值 | |------|------| | WiFi 网卡 | Qualcomm QCA9565 802.11b/g/n | | 连接 AP | HUAWEI-2.4G-HHVT (2.4GHz, 频道1) | | 信号强度 | ~34% | | 链路速度 | 72.2 Mbps | | 以太网口 | Realtek PCIe GbE,状态 Disconnected(不可用) | **影响:** 2.4GHz WiFi 信号弱 + 干扰大 → SSH 隧道间歇性断连。物理层无法优化。 **应对措施(三层防御):** 1. SSH 双向保活(ServerAliveInterval=15 + ClientAliveInterval=30) 2. `ssh-tunnel-watchdog.sh` 隧道守护(每10秒检测,断了自动重建) 3. `batch-runner.js` 内置 `waitForCdpRecovery()`(CDP断开等5分钟恢复,不直接停止) ## 注意事项 1. Windows SSH 服务器是 OpenSSH for Windows,部分 Linux 命令不可用 2. 路径分隔符是 `\\`,脚本中注意跨平台兼容 3. PowerShell 和 CMD 行为不同,脚本中优先用 Node.js API 而非 shell 命令 4. Windows 防火墙可能阻止 CDP 端口(9222),需确认放行 5. SSH 端口隧道的本地端口用 9223(避免和 Linux 本地 9222 冲突) 6. Chrome `--user-data-dir` 必须是独立目录,默认目录被锁定 7. SSH 隧道必须保持连接,断开后脚本无法连接 Chrome 8. Windows 端 PowerShell 转义引号复杂,建议通过 `powershell -Command "..."` 执行 9. 脚本通过 `CDP_PORT` 环境变量指定 CDP 端口,默认 9222