Mein Skript zum Einrichten der Portweiterleitung zu WSL 2 SSH schlägt fehl

Mein Skript zum Einrichten der Portweiterleitung zu WSL 2 SSH schlägt fehl

Früher konnte ich mich mit einem SSH-Skript verbinden und die IP auf 127.0.0.2 setzen, aber jetzt funktioniert es nicht mehr bei jedem Start. Ich weiß nicht, warum. Ich habe es mit localhost oder 127.0.0.1 versucht, aber es funktioniert nicht. Ich kann auf Websites auf localhost zugreifen. Wie erhalte ich die Portnummer und die IP, mit der ich mich über SecureCRT auf meinem eigenen Computer verbinden kann, auf dem WSL2 gehostet wird?

try {
## Port forward WSL virtual machine ports to host firewall for remote access
## !! this script must be run as Administrator !!
##  powershell -executionpolicy bypass -file "c:\docker\WSL-portproxy.ps1"

## ip -o -4 -f inet addr show eth0 | awk '{ split($4, ip_addr, "/"); print ip_addr[1]; }'
##   print out is "4:  eth0  inet  172.20.x.x/20  brd  ..." string
$remoteport = bash.exe -c "ip -o -4 -f inet addr show eth0";
$remoteport = ($remoteport -split "\s+")[3];
$remoteport = $remoteport.substring(0, $remoteport.LastIndexOf("/"));
$found      = $remoteport -match '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}';
if(!$found){
  echo "WSL ip address not found";
  exit;
}
echo "WSL ip address $remoteport";

# Port forwards from WSL virtual machine to Win10 host firewall
# Bind a specific host ip addr or use 0.0.0.0 default
$ports=@(2222);
$addr='127.0.0.2';

# Remove firewall exception rules, add inbound and outbound rules
$ports_a = $ports -join ",";
echo "Firewall inbound/outbound rules";
iex "Remove-NetFireWallRule -DisplayName 'WSL Firewall Unlock' ";
iex "New-NetFireWallRule -DisplayName 'WSL Firewall Unlock' -Description 'Remote access to WSL services' -Direction Outbound -LocalPort $ports_a -Action Allow -Protocol TCP";
iex "New-NetFireWallRule -DisplayName 'WSL Firewall Unlock' -Description 'Remote access to WSL services' -Direction Inbound  -LocalPort $ports_a -Action Allow -Protocol TCP";

for( $i = 0; $i -lt $ports.length; $i++ ){
  $port = $ports[$i];
  echo "portproxy ${addr}:${port} to ${remoteport}:${port}";
  iex "netsh interface portproxy delete v4tov4 listenport=$port listenaddress=$addr";
  iex "netsh interface portproxy add    v4tov4 listenport=$port listenaddress=$addr connectport=$port connectaddress=$remoteport";
}

    # Do your script's stuff
}
catch
{
    Write-Error $_.Exception.ToString()
    Read-Host -Prompt "The above error occurred. Press Enter to exit."
}

Konnte es hiermit einrichten, aber es funktioniert nicht mehr.

Ich erhalte die folgende Fehlermeldung:

C:\Users\admin\Downloads\f.ps1 : System.Management.Automation.RuntimeException: You cannot call a method on a
null-valued expression.
   at System.Management.Automation.ExceptionHandlingOps.CheckActionPreference(FunctionContext funcContext, Exception
exception)
   at System.Management.Automation.Interpreter.ActionCallInstruction`2.Run(InterpretedFrame frame)
   at System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)
   at System.Management.Automation.Interpreter.EnterTryCatchFinallyInstruction.Run(InterpretedFrame frame)
At line:1 char:91
+ ... tionPolicy -Scope Process Bypass }; & 'C:\Users\admin\Downloads\f.ps1'
+                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,f.ps1

Antwort1

Wie erhalte ich die Portnummer und IP, mit der ich über SecureCRT auf meinem eigenen Computer, auf dem WSL2 gehostet wird, eine Verbindung herstellen kann?

Vielleicht verstehe ich Ihre Frage völlig falsch, aber dassollte seinsehr unkompliziert und sollte überhaupt kein Skript erfordern.

Wenn Sie eine Verbindung herstellen:

  • AusSecureCRT auf dem Computer, der WSL2 hostet
  • Zueine WSL2-Instanz auf dieser Maschine

Dann bietet WSL2 eine Funktion namens "Localhost Forwarding" (seit Build 18945, lautDiese Internetseite.

Das von Ihnen verwendete Skript ist anscheinend sehr alt, nicht nur, weil Sie es nicht mehr benötigen, sondern weil es den Befehl verwendet , der vor einigen Jahren ebenfalls bash.exedurch den viel flexibleren ersetzt wurde . Eine Zeit lang wurde es von Microsoft als „historischer Befehl“ aufgeführt, aber im neuesten Dokumentwsl.exebash.exees ist als veraltet gekennzeichnet.

Wie dem auch sei, zu Ihrer Kernfrage, gemäß derWSL-Dokument:

Wenn Sie in Ihrer Linux-Distribution eine Netzwerk-App erstellen (beispielsweise eine App, die auf einem NodeJS- oder SQL-Server ausgeführt wird), können Sie über localhost (wie Ihren Internetbrowser Edge oder Chrome) darauf zugreifen (so wie Sie es normalerweise tun).

Wenn Sie jedoch eine ältere Windows-Version (Build 18945 oder niedriger) verwenden, müssen Sie die IP-Adresse der Linux-Host-VM abrufen (oder auf die neueste Windows-Version aktualisieren).

Dies gilt nicht nur für das „Erstellen einer App“, sondern auch für vorhandene Apps/Dienste wie SSH.

Das bedeutet, dass beim Versuch, eine Verbindung zu einem localhostPort in Windows herzustellen, automatisch versucht wird, die Verbindung an diesen Port in WSL2 weiterzuleiten (alle Instanzen, da sie denselben Netzwerkstapel verwenden), sofern der Port nicht an eine App/einen Dienst in Windows selbst gebunden ist.

Wenn Ihre WSL2-Instanz also SSH auf Port 2222 ausführt, dannsollenlocalhost:2222Sie können sich einfach ohne zusätzlichen Aufwand von SecureCRT aus verbinden .

Es gibt einige Gründe, warum diesnichtarbeiten:

  • Wenn Sie eine %userprofile%\.wslconfigDatei mitlocalhostWeiterleitungfalseexplizit auf (unwahrscheinlich) gesetzt

  • Es ist bekannt, dass die Localhost-Weiterleitung nicht mehr funktioniert, wenn Windows in den Ruhezustand wechselt. Der Ruhezustand kann auch unbemerkt durch die Option „Schnellstart“ ausgelöst werden, die in Windows standardmäßig aktiviert ist. Siehemeine Antwort auf Stack Overflowfür mehr Informationen.

Abgesehen davon ist es (wieder)sollenfunktioniert ohne komplizierte Weiterleitungsskripte.

verwandte Informationen