Solía poder conectarme usando un script SSH y configurando la IP en 127.0.0.2, pero ahora ya no funciona en cada inicio. No estoy seguro por qué. Probé localhost o 127.0.0.1, pero no funciona. Puedo acceder a sitios web en localhost. ¿Cómo obtengo el número de puerto y la IP a la que puedo conectarme a través de SecureCRT en mi propia máquina que aloja WSL2?
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."
}
Pude configurarlo usando esto, pero ya no funciona.
Obtuve el siguiente error:
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
Respuesta1
¿Cómo obtengo el número de puerto y la IP a la que puedo conectarme a través de SecureCRT en mi propia máquina que aloja WSL2?
Quizás estoy entendiendo muy mal tu pregunta, pero estodebiera sermuy sencillo y no debería requerir ningún guión.
Si te estás conectando:
- DeSecureCRT en la máquina que aloja WSL2
- Auna instancia WSL2 en esa máquina
Luego, WSL2 proporciona una característica conocida como "reenvío de host local" (desde la compilación 18945, segúneste sitio web.
El script que está utilizando es aparentemente muy antiguo, no sólo porque ya no debería necesitarlo, sino porque utiliza el comando, que también bash.exe
fue reemplazado por uno mucho más flexible hace varios años. wsl.exe
Durante un tiempo, Microsoft lo incluyó bash.exe
como "comando histórico", pero en el último documentoestá etiquetado como obsoleto.
De todos modos, con respecto a su pregunta central, según eldocumento WSL:
Si está creando una aplicación de red (por ejemplo, una aplicación que se ejecuta en un servidor NodeJS o SQL) en su distribución de Linux, puede acceder a ella desde una aplicación de Windows (como su navegador de Internet Edge o Chrome) usando localhost (como lo haría normalmente). ).
Sin embargo, si está ejecutando una versión anterior de Windows (compilación 18945 o menos), necesitará obtener la dirección IP de la máquina virtual host de Linux (o actualizar a la última versión de Windows).
Esto se aplica no sólo a "crear una aplicación", sino también a aplicaciones/servicios existentes como SSH.
Lo que significa es que, cuando intenta conectarse a un localhost
puerto en Windows, si el puerto no está vinculado por una aplicación/servicio en Windows, automáticamente intenta reenviar la conexión a ese puerto en WSL2 (cualquiera y todas casos, ya que comparten la misma pila de red).
Entonces, realmente, si su instancia WSL2 ejecuta SSH en el puerto 2222, entoncesdeberíasimplemente podrá conectarse desde SecureCRT localhost:2222
sin ningún esfuerzo adicional.
Hay algunas razones por las que esto podríanotrabajar:
Si tienes un
%userprofile%\.wslconfig
archivo conlocalhostReenvíoestablecido explícitamente enfalse
(poco probable)Se sabe que el reenvío de localhost deja de funcionar cada vez que Windows hiberna. La hibernación también puede activarse sin saberlo mediante la opción "Inicio rápido", que es la opción predeterminada en Windows. Vermi respuesta sobre Stack Overflowpara más información.
Aparte de eso, (otra vez)deberíaTrabaja sin scripts de reenvío complicados.