Files
local_machine/docs/apps/cursor/scripts/cursor-socks-tunnel.ps1
ahauimix 1938b7c743 Expand local_machine docs and automation for connectivity, games, and ops.
Add proxy/VPN/telegram launchd and emergency runbooks; reorganize apps docs;
document JA3 CrossOver runbook and Wine troubleshooting; add GOG/HoMM game
scripts, disk cleanup guides, and gitea push-via-proxy helper. Ignore temp/.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-01 08:12:19 +03:00

108 lines
4.0 KiB
PowerShell
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# SOCKS5-туннель для Cursor (обход PING timeout из РФ).
# Использование: .\cursor-socks-tunnel.ps1 [start|stop|status]
# См. docs/cursor/README.md и docs/connectivity/WINDOWS_CURSOR_TUNNEL.md
param(
[Parameter(Position = 0)]
[ValidateSet("start", "stop", "status")]
[string]$Command = "start"
)
$CURSOR_SOCKS_PORT = if ($env:CURSOR_SOCKS_PORT) { $env:CURSOR_SOCKS_PORT } else { "10809" }
$SSH_HOST = if ($env:CURSOR_TUNNEL_HOST) { $env:CURSOR_TUNNEL_HOST } else { "ahau@149.154.64.19" }
$CursorViaDo = ($env:CURSOR_SOCKS_VIA_DO -ne "0")
function Test-PortListening {
$conn = Get-NetTCPConnection -LocalPort $CURSOR_SOCKS_PORT -State Listen -ErrorAction SilentlyContinue
return $null -ne $conn
}
function Get-SshTunnelPids {
# Найти процессы ssh.exe, у которых в командной строке есть -D и наш порт
Get-CimInstance Win32_Process -Filter "Name = 'ssh.exe'" -ErrorAction SilentlyContinue |
Where-Object { $_.CommandLine -match "-D\s+$CURSOR_SOCKS_PORT" } |
ForEach-Object { $_.ProcessId }
}
function Start-Tunnel {
if (Test-PortListening) {
Write-Host "SOCKS already listening on 127.0.0.1:$CURSOR_SOCKS_PORT"
return
}
$targetHost = $SSH_HOST
$stableOpts = @(
"-o", "TCPKeepAlive=yes",
"-o", "IPQoS=throughput",
"-o", "ServerAliveInterval=60",
"-o", "ServerAliveCountMax=4"
)
$ruOpts = @(
"-o", "ServerAliveInterval=30",
"-o", "ServerAliveCountMax=6"
)
if ($CursorViaDo) {
& ssh -o BatchMode=yes -o ConnectTimeout=6 -o ConnectionAttempts=1 hsites-ahau "exit 0" 2>$null
if ($LASTEXITCODE -ne 0) {
Write-Error "hsites-ahau недоступен: SOCKS только по цепочке Mac→RU→DO (без прямого Mac→DO). Восстановите SSH до RU или задайте CURSOR_SOCKS_VIA_DO=0."
exit 1
}
$targetHost = "telegram-socks-via-do"
}
$sshArgs = @(
"-D", $CURSOR_SOCKS_PORT,
"-f", "-N"
)
if ($CursorViaDo) {
$sshArgs += $stableOpts
} else {
$sshArgs += $ruOpts
}
$sshArgs += $targetHost
& ssh @sshArgs
if ($LASTEXITCODE -eq 0) {
if ($CursorViaDo) {
Write-Host "SOCKS tunnel started: 127.0.0.1:$CURSOR_SOCKS_PORT -> $targetHost (DO exit)"
} else {
Write-Host "SOCKS tunnel started: 127.0.0.1:$CURSOR_SOCKS_PORT -> $targetHost (RU exit, CURSOR_SOCKS_VIA_DO=0)"
}
} else {
Write-Error "Failed to start tunnel (exit code $LASTEXITCODE). Check SSH config (telegram-socks-via-do) or host: $targetHost"
exit $LASTEXITCODE
}
}
function Stop-Tunnel {
$pids = Get-SshTunnelPids
if ($pids) {
foreach ($pid in $pids) {
Stop-Process -Id $pid -Force -ErrorAction SilentlyContinue
}
Write-Host "Tunnel stopped (killed SSH process(es): $($pids -join ', '))."
} else {
# Fallback: убить процесс, занимающий порт 10809
$conn = Get-NetTCPConnection -LocalPort $CURSOR_SOCKS_PORT -State Listen -ErrorAction SilentlyContinue
if ($conn) {
$conn | ForEach-Object { Stop-Process -Id $_.OwningProcess -Force -ErrorAction SilentlyContinue }
Write-Host "Tunnel stopped (killed process on port $CURSOR_SOCKS_PORT)."
} else {
Write-Host "No SOCKS tunnel found on port $CURSOR_SOCKS_PORT."
}
}
}
function Get-Status {
if (Test-PortListening) {
Write-Host "SOCKS listening on 127.0.0.1:$CURSOR_SOCKS_PORT"
Get-NetTCPConnection -LocalPort $CURSOR_SOCKS_PORT -State Listen -ErrorAction SilentlyContinue |
Format-Table LocalAddress, LocalPort, State, OwningProcess -AutoSize
} else {
Write-Host "No SOCKS listener on port $CURSOR_SOCKS_PORT"
}
}
switch ($Command) {
"start" { Start-Tunnel }
"stop" { Stop-Tunnel }
"status" { Get-Status }
}