diff --git a/tools/tunnel-einrichten.ps1 b/tools/tunnel-einrichten.ps1 index 9996545..5a9bf49 100644 --- a/tools/tunnel-einrichten.ps1 +++ b/tools/tunnel-einrichten.ps1 @@ -25,7 +25,12 @@ [CmdletBinding()] param( [string]$Server = '88.218.224.10', - [string]$Benutzer = $env:USERNAME, + # KEIN Standard aus $env:USERNAME. Der lokale Windows-Name und das Konto auf + # dem Server sind oft verschieden -- hier hiess der eine "az319" und der + # andere "Darkster". Das Skript lief dann sauber durch und der Tunnel kam + # trotzdem nicht, mit einer Fehlermeldung, die auf den Schluessel zeigte + # statt auf den Namen. Lieber einmal fragen als einmal in die Irre fuehren. + [string]$Benutzer, # Der Port auf DIESEM Rechner. Nicht 3389 nehmen: Windows lauscht dort # selbst, und dann landet die Verbindung auf dem eigenen PC statt im Tunnel # -- mit der irreführenden Meldung "Konsolensitzung bereits aktiv". @@ -35,6 +40,12 @@ param( ) $ErrorActionPreference = 'Stop' + +if (-not $Benutzer) { + Write-Host "Wie heisst dein Konto AUF DEM SERVER? (nicht der Name hier am PC)" -ForegroundColor Yellow + $Benutzer = (Read-Host ' Benutzername').Trim() + if (-not $Benutzer) { Write-Host ' Ohne Benutzernamen geht es nicht.' -ForegroundColor Red; exit 1 } +} function Schritt($t) { Write-Host "==> $t" -ForegroundColor Cyan } function Gut($t) { Write-Host " $t" -ForegroundColor Green } function Warnung($t) { Write-Host " $t" -ForegroundColor Yellow } @@ -163,8 +174,29 @@ if ($steht) { Write-Host " Nicht mehr auf $Server verbinden -- das ist gesperrt." -ForegroundColor DarkGray } else { Warnung "Der Tunnel steht noch nicht auf Port $LokalerPort." - Warnung 'Häufigste Ursache: der öffentliche Schlüssel ist auf dem Server noch' - Warnung 'nicht hinterlegt. Zum Nachsehen einmal von Hand, dann sagt ssh warum:' - Write-Host "" - Write-Host " ssh $Benutzer@$Server" -ForegroundColor White + Write-Host '' + # NACHSEHEN STATT RATEN. Die erste Fassung behauptete hier "der Schluessel + # fehlt auf dem Server" -- und lag falsch: es war der Benutzername. Eine + # geratene Ursache schickt den Suchenden in die falsche Richtung, und das + # kostet mehr Zeit als gar kein Hinweis. + Schritt 'Nachsehen, woran es liegt' + $antwort = & $ssh -o BatchMode=yes -o ConnectTimeout=10 ` + -o StrictHostKeyChecking=accept-new "$Benutzer@$Server" 'exit' 2>&1 | Out-String + + if ($antwort -match 'Permission denied') { + Warnung 'Der Server nimmt den Schluessel nicht an. Zwei Ursachen sind haeufig:' + Warnung " - Der Benutzername stimmt nicht. Du hast '$Benutzer' benutzt --" + Warnung ' ist das dein Konto AUF DEM SERVER, nicht das hier am PC?' + Warnung ' - Der oeffentliche Schluessel ist dort noch nicht hinterlegt:' + Write-Host '' + Write-Host (" " + (Get-Content "$schluessel.pub")) -ForegroundColor White + } elseif ($antwort -match 'Could not resolve|timed out|refused|unreachable') { + Warnung "Der Server ist nicht erreichbar: $($antwort.Trim())" + } elseif ($antwort.Trim()) { + Warnung "ssh sagt: $($antwort.Trim())" + } else { + Warnung 'ssh selbst kommt durch -- dann klemmt es an der Weiterleitung.' + Warnung "Steht auf dem SERVER etwas auf Port $ZielPort und laesst er" + Warnung 'Weiterleitungen zu (AllowTcpForwarding)?' + } }