前言
- 目前在windows與windows的wsl系統之間,宿主機無法透過相對較固定的方式來進行網路訪問,通常需要使用wsl的ip來訪問,而ip可能不是很直觀並且可能會有變更,當前教程解決了這個問題,透過hosts對映的方式實現windows宿主機訪問wsl服務。
- 指令碼的原理:在linux啟動時,執行一次修改windows上的hosts檔案的指令碼。為windows新增wsl的host,這樣就能做到自定義域名訪問
具體教程
1. 給予當前windows使用者修改hosts檔案的許可權
快捷鍵win+r,輸入C:\Windows\System32\drivers\etc,或在該資料夾中找到hosts檔案,右鍵選擇“屬性” ,選擇“安全選項卡”;
點選“編輯”,找到當前使用者組(一般是Users),為其新增完全控制許可權,即勾選"完全控制",彈出的對話方塊確認,確定即可。
2. 進入Windows Linux子系統(切換到root賬戶操作),在/opt/目錄下新建指令碼。
cd /opt/ vim win_wsl_domain.sh
3. 貼上指令碼內容,其中wsl_domain為自定義域名,可以修改為想要的,儲存。
#!/bin/bash win_hosts_path="/mnt/c/Windows/System32/drivers/etc/hosts" #================= # win_domain="win02" # # 獲取 win 的 ip # win_ip=$(/mnt/c/Windows/System32/WindowsPowerShell/v1.0/powershell.exe -Command "Get-NetIPAddress -AddressFamily IPv4 | Where-Object { \$_.InterfaceAlias -notmatch 'vEthernet' -and \$_.AddressState -eq 'Preferred' -and \$_.IPAddress -ne '127.0.0.1' } | Select-Object -ExpandProperty IPAddress -First 1") # # 判斷是否已存在 win 的域名,如果存在則修改,否則追加 # if grep -wq "$win_domain" $win_hosts_path; then # # 此處因為許可權問題沒有直接用 sed 修改 hosts 檔案 # win_hosts=$(sed -s "s/.* $win_domain/$win_ip $win_domain/g" $win_hosts_path) # echo "$win_hosts" > $win_hosts_path # echo "$(date '+%Y-%m-%d %H:%M:%S') 修改win-hosts[$win_domain] ==> $win_ip $win_domain" # else # echo "$win_ip $win_domain" >> $win_hosts_path # echo "$(date '+%Y-%m-%d %H:%M:%S') 新增win-hosts[$win_domain] ==> $win_ip $win_domain" # fi #================= wsl_domain="wslubuntu" # 獲取 wsl 的 ip wsl_ip=$(ifconfig eth0 | grep -w inet | awk '{print $2}') # 判斷是否已存在 win 的域名,如果存在則修改,否則追加 if grep -wq "$wsl_domain" $win_hosts_path; then # 此處因為許可權問題沒有直接用 sed 修改 hosts 檔案 win_hosts=$(sed -s "s/.* $wsl_domain/$wsl_ip $wsl_domain/g" $win_hosts_path) echo "$win_hosts" > $win_hosts_path echo "$(date '+%Y-%m-%d %H:%M:%S') 修改win-hosts[$wsl_domain] ==> $wsl_ip $wsl_domain" else echo "$wsl_ip $wsl_domain" >> $win_hosts_path echo "$(date '+%Y-%m-%d %H:%M:%S') 新增win-hosts[$wsl_domain] ==> $wsl_ip $wsl_domain" fi echo "host change ok!"
4. 把上述指令碼設定成一個服務,方便啟動時自動執行和日誌的檢視,貼上內容並儲存。
vim /etc/systemd/system/winhosts.service 貼上內容: [Unit] Description=Run my script at startup [Service] ExecStart=bash /opt/win_wsl_domain.sh Restart=on-failure [Install] WantedBy=default.target
5. 載入服務並設定開機執行
sudo systemctl daemon-reload sudo systemctl start winhosts.service sudo systemctl enable winhosts.service
6. 檢視日誌,日誌正常即可
journalctl -u winhosts.service -f -o cat
7. 後續操作回到宿主機windows系統開啟命令列工具PowerShell,此時在宿主機已經可以使用自定義的域名(wslubuntu) ping通wsl2子系統了,如下:
8. 最後做一個埠對映(此例為ssh服務的埠22,區域網內其它電腦直接ssh root@上述宿主機ip即可完成連線wsl2系統),方便區域網內其它主機訪問到此電腦的wsl2子系統中的服務(其它)
新增埠對映: netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=22 connectaddress=wslubuntu connectport=22 刪除埠對映: netsh interface portproxy delete v4tov4 listenaddress=0.0.0.0 listenport=22 檢視所有的對映: netsh interface portproxy show all