Раньше я мог подключаться с помощью скрипта SSH и установки IP на 127.0.0.2, но теперь это больше не работает при каждом запуске. Я не уверен, почему. Я пробовал localhost или 127.0.0.1, но это не работает. Я могу получить доступ к веб-сайтам на localhost. Как мне получить номер порта и IP, к которым я могу подключиться через SecureCRT на моей собственной машине, на которой размещен 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."
}
Мне удалось настроить его с помощью этого, но теперь он не работает.
Я получаю следующую ошибку:
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
решение1
Как получить номер порта и IP-адрес, к которым я могу подключиться через SecureCRT на моем компьютере, на котором размещен WSL2?
Возможно, я совершенно не понимаю ваш вопрос, но этодолжно бытьочень просто и вообще не требует сценария.
Если вы подключаетесь:
- ОтSecureCRT на машине, на которой размещен WSL2
- Кэкземпляр WSL2 на этой машине
Затем WSL2 предоставляет функцию, известную как «переадресация локального хоста» (начиная со сборки 18945, согласноэтот сайт.
Скрипт, который вы используете, по-видимому, очень старый, не только потому, что он вам больше не нужен, но и потому, что он использует команду bash.exe
, которая была заменена гораздо более гибкой wsl.exe
несколько лет назад. Некоторое время Microsoft указывала его bash.exe
как «историческую команду», но в последнем документеон помечен как устаревший.
В любом случае, что касается вашего основного вопроса, согласноWSL документ:
Если вы создаете сетевое приложение (например, приложение, работающее на сервере NodeJS или SQL) в своем дистрибутиве Linux, вы можете получить к нему доступ из приложения Windows (например, из интернет-браузера Edge или Chrome), используя localhost (как вы это обычно делаете).
Однако если вы используете более старую версию Windows (сборка 18945 или ниже), вам потребуется получить IP-адрес виртуальной машины Linux-хоста (или обновить ее до последней версии Windows).
Это касается не только «создания приложения», но и существующих приложений/сервисов, таких как SSH.
Это означает, что при попытке подключения к localhost
порту в Windows, если порт не привязан к приложению/службе в самой Windows, система автоматически пытается перенаправить соединение на этот порт в WSL2 (любые экземпляры, поскольку они используют один и тот же сетевой стек).
Итак, если ваш экземпляр WSL2 использует SSH на порту 2222, то выдолженпросто иметь возможность подключиться из SecureCRT localhost:2222
без дополнительных усилий.
Есть несколько причин, по которым это может произойти.нетработа:
Если у вас есть
%userprofile%\.wslconfig
файл сlocalhostПересылкаявно установленоfalse
(маловероятно)Известно, что переадресация Localhost прекращает работу, когда Windows переходит в спящий режим. Спящий режим также может быть непреднамеренно вызван опцией «Быстрый запуск», которая установлена в Windows по умолчанию. Смотритемой ответ на Stack OverflowЧтобы получить больше информации.
Кроме этого, это (опять же)долженработа без сложных скриптов пересылки.