Python 實現 WSL 2 自動 Windows 主機IP和端口轉發,可遠程 SSH 登錄和訪問

WSL 2 安裝教程:https://docs.microsoft.com/zh-cn/windows/wsl/wsl2-install

WSL 2 和 WSL 1 一個很大的不同點,WSL 1 是和 Windows 共享 IP 地址,因此可以直接通過主機 IP 地址直接 SSH 登錄。

而 WSL 2 則採用了像 VMware 虛擬機一樣的 Hyper-V 虛擬網絡,本想着直接用 Windows 的端口監聽和轉發工具netsh interface portproxy add將 Windows 主機地址代理到 WSL 2 ,然鵝 WSL 2 的一個神坑是,每次重啓後的 IP 地址不一樣。試過 Hyper-V 虛擬網絡設置工具,無效,目測每次 WSL 2 重啓都刪掉先前的 Hyper-V 虛擬網絡重新新建一個。

感謝某個大佬提供的解決思路,將 WSL 2 的 IP 地址寫入 Windows 的 hosts 文件,然後設置 Windows 的代理轉發到 hostname 即可。

WSL 安裝 SSH 服務

重新安裝 SSH Server:

# 在 WSL 下運行
sudo apt remove openssh-server
sudo apt install openssh-server

如果需要自定義 SSH Server 端口號,編輯 sshd_config 文件

sudo vim /etc/ssh/sshd_config
# 編輯完成後重啓 ssh Server
sudo service ssh --full-restart

sshd_config 文件

# 端口號,默認 22
Port 22
# 允許密碼 登陸驗證
PasswordAuthentication yes

將 WSL 的 IP 地址寫入到 Windows hosts 文件

在 PowerShell 運行如下命令:

wsl ip a |wsl grep -w "inet" |wsl cut -d " " -f 6 |wsl cut -d "/" -f 1
# 看輸出的 IP 地址,根據你的實際情況取
127.0.0.1
172.25.191.98

新建 ChangeWslHosts.py:

import os
# 獲得 ip 地址
ip_cmd = 'wsl ip a |wsl grep -w "inet" |wsl cut -d " " -f 6 |wsl cut -d "/" -f 1'
shells = os.popen(ip_cmd).readlines()
wsl_ip = shells[1].split("\n")[0]

# 寫入 Windows hosts 文件
file_path = "C:/Windows/System32/drivers/etc/hosts"
with open(file_path, "r") as f:
    lines = f.readlines()

found = False
# 查找 hostname 爲 ubuntu 的行
for i, line in enumerate(lines):
    if len(line) > 10 and line.find("ubuntu") > -1:
        found = True
        # 替換爲當前的 ip
        lines[i] = wsl_ip + "  ubuntu"
        break

# 沒有hostname 爲 ubuntu 的行
if not found:
    lines.append("\n" + wsl_ip + "  ubuntu")

# 寫入文件
if lines :
    with open(file_path, "w") as f:
        f.write("".join(lines))

新建 ChangeWslHosts.bat 的腳本:可以在 Python 中執行這些命令的

Windows 如果安裝了 SSH Server 服務,listenport=22會導致端口衝突,可以更換端口號或者卸載禁用 Windows 的 SSH 服務。

# 獲得管理員權限
%1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
# 用 WSL 的 root 重啓 WSL 的 ssh 服務,WSL 的 bug
wsl -u root service ssh --full-restart
# 執行 Python 腳本
python D:/Project/Tools/ChangeWslHosts.py
# 解除 192.168.0.10(Windows IP) 的代理監聽
netsh interface portproxy delete v4tov4 listenaddress=192.168.0.10  listenport=22
# 將 192.168.0.10(Windows IP) 轉發至 ubuntu(wsl IP) 的 22 端口
netsh interface portproxy add v4tov4 listenaddress=192.168.0.10 listenport=22 connectaddress=ubuntu connectport=22

解除 Windows 代理轉發的命令是:

# 解除 192.168.0.10(Windows IP) 的代理監聽
netsh interface portproxy delete v4tov4 listenaddress=192.168.0.10  listenport=22

運行 Bat 腳本,運行 ssh 登錄命令:

# 192.168.0.10 替換爲 你的 Windows 本地 IP地址
ssh [email protected]

如果其他電腦無法訪問,在 Windows 防火牆添加允許 22 端口出入站的規則。

TODO:將 BAT 加入 Windows 的自啓。好像加 bat 放入下面的文件夾裏就可以誒:

C:\Users\username\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
# 或者
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup

TODO 打包成 exe 運行文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章