我曾經能夠透過使用 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 等現有應用程式/服務。
這意味著,當您嘗試連接到localhost
Windows 中的連接埠時,如果該連接埠未受 Windows 本身中的應用程式/服務綁定,那麼它會自動嘗試將連線轉送到 WSL2 中的該連接埠(任何和所有實例,因為它們共享相同的網路堆疊)。
所以說真的,如果您的 WSL2 實例在連接埠 2222 上執行 SSH,那麼您應該只需能夠從 SecureCRT 進行連接,localhost:2222
無需任何額外的努力。
有幾個原因可能會導致這種情況不是工作:
如果您有一個
%userprofile%\.wslconfig
文件本地主機轉送明確設定為false
(不太可能)已知只要 Windows 休眠,本機轉送就會停止運作。 「快速啟動」選項也可能在不知不覺中觸發休眠,該選項是 Windows 中的預設。看我在 Stack Overflow 的回答了解更多。
除此之外,它(再次)應該無需任何複雜的轉發腳本即可運作。