我用於設定 WSL 2 SSH 連接埠轉送的腳本失敗

我用於設定 WSL 2 SSH 連接埠轉送的腳本失敗

我曾經能夠透過使用 SSH 腳本並將 IP 設定為 127.0.0.2 進行連接,但現在它不再在每次啟動時都有效。我不知道為什麼。我嘗試了 localhost 或 127.0.0.1,但不起作用。我可以造訪本地主機上的網站。如何在我自己的託管 WSL2 的電腦上取得可以透過 SecureCRT 連接的連接埠號碼和 IP?

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

如何在我自己的託管 WSL2 的電腦上取得可以透過 SecureCRT 連接的連接埠號碼和 IP?

也許我嚴重誤解了你的問題,但這個應該非常簡單,根本不需要腳本。

如果您正在連線:

  • 託管 WSL2 的電腦上的 SecureCRT
  • 該機器上的 WSL2 實例

然後 WSL2 提供了一個稱為「本地主機轉送」的功能(自建置 18945 以來,根據這個網站

您使用的腳本顯然非常舊,不僅因為您不再需要它,還因為它使用了該命令,該命令在幾年前也bash.exe被更靈活的命令所取代。wsl.exe有一段時間,微軟將其列為bash.exe“歷史命令”,但在最新的文檔中它被標記為已棄用

無論如何,關於你的核心問題,根據WSL 文件:

如果您正在Linux 發行版中建立網頁應用程式(例如在NodeJS 或SQL 伺服器上執行的應用程式),則可以使用localhost 從Windows 應用程式(例如Edge 或Chrome 網際網路瀏覽器)存取它(就像您通常使用的那樣) )。

但是,如果您使用的是舊版的 Windows(內部版本 18945 或更低版本),則需要取得 Linux 主機 VM 的 IP 位址(或更新至最新的 Windows 版本)。

這不僅適用於“建立應用程式”,也適用於 SSH 等現有應用程式/服務。

這意味著,當您嘗試連接到localhostWindows 中的連接埠時,如果該連接埠未受 Windows 本身中的應用程式/服務綁定,那麼它會自動嘗試將連線轉送到 WSL2 中的該連接埠(任何和所有實例,因為它們共享相同的網路堆疊)。

所以說真的,如果您的 WSL2 實例在連接埠 2222 上執行 SSH,那麼您應該只需能夠從 SecureCRT 進行連接,localhost:2222無需任何額外的努力。

有幾個原因可能會導致這種情況不是工作:

  • 如果您有一個%userprofile%\.wslconfig文件本地主機轉送明確設定為false(不太可能)

  • 已知只要 Windows 休眠,本機轉送就會停止運作。 「快速啟動」選項也可能在不知不覺中觸發休眠,該選項是 Windows 中的預設。看我在 Stack Overflow 的回答了解更多。

除此之外,它(再次)應該無需任何複雜的轉發腳本即可運作。

相關內容