利用python脚本解决wsl2 ip不固定的问题
环境信息
wsl2 中linux版本:ubuntu
windows版本: win10/win11
问题描述
最近装了wsl2,使用vscode远程连接wsl2时遇到了如下问题:
1、wsl2的ip无法固定
2、wsl2的ssh服务不能自动开启。
尝试了网上许多方法,都不能解决,于是决定自己写python脚本解决。
如下方案可以自动将wsl2的ip同步到vscode remote ssh的config文件中,同时自动开启wsl2中的ssh服务。
不算很完美的方案,但至少每次开机不用手动开启wsl2中ubuntu的ssh服务,不需要设置vscode中remote ssh的config文件中ip地址了,还算比较方便。
方案概览
在windows端开机启动一个socket服务器,等待接受wsl2端发来ip。接受到ip后,将ip存储到remote ssh的config中。
wsl2在启动bash时默认开启socket客户端,将自己的ip发往windows端。
注意事项
1、remote ssh 的config文件中wsl2远程连接的配置中的ip地址必须在第二行,且HostName前是四个空格。如下图所示
2、每次打开一个wsl2中的ubuntu终端,都会自动同步一次,前提是windows端的脚本得一直运行着,不要关闭了。
需要解决如下几个问题。
1、需要在wsl2中ubuntu设置普通用户sudo时 免密登录。比如 sudo service ssh start
时,不需要输入密码
2、wsl2端ping不通windows,需要关闭windows防火墙或者设置防火墙规则。
3、windows端python脚本需要开机启动。
4、windows端、wsl2中的ubuntu都需要安装python3
好吧,下面正式开始操作!
开机启动windows端服务器脚本
首先需要在C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup中增加一个bat脚本(wsl_ip.bat)
c:
cd C:\Users\82383\my_bat
python WSL_IP_windows.py
脚本解释:
-
c: 进入c盘
-
cd C:\Users\82383\my_bat 进入存放python脚本的目录,该目录可以自己选择,最好放在windows家目录中。
-
python WSL_IP_windows.py 运行windows端服务器脚本
注意 : 如下脚本仅仅需要修改config文件路径,详情请看注释!
# WSL_IP_windows.py
import socket # 导入 socket 模块
# 如下设置为您的config文件路径即可,注意 \\ 转义字符。您只需要修改这里!
config_file = "C:\\Users\\82383\\.ssh\\config"
def get_ubuntu_ip():
f = open(config_file,"r")
lines = f.readlines()
strip_line = lines[1].strip()
split_list = strip_line.split()
ubuntu_ip = split_list[1]
print(ubuntu_ip)
return ubuntu_ip, lines
def writefile(content):
f = open(config_file,"w")
for line in content:
f.write(line)
f.close()
if __name__ == "__main__":
s = socket.socket() # 创建 socket 对象
host = socket.gethostname() # 获取本地主机名
port = 9999 # 设置端口
s.bind((host, port)) # 绑定端口
s.listen(10) # 等待客户端连接
print("开始等待wsl2连接!")
while True:
c,addr = s.accept() # 建立客户端连接
print("wsl2 set up a link!")
ubuntu_ip, lines = get_ubuntu_ip()
print("windows remote ssh config ip = {}".format(ubuntu_ip))
ret = c.recv(1024).decode('utf-8')
print('连接地址:{} c : {} \n ubuntu ip = {}'.format(addr, c, ret))
if ret != ubuntu_ip:
lines[1] = " HostName {}\n".format(ret)
writefile(lines)
c.send("sync".encode('utf-8'))
print("vscode remote ssh: wsl ip set successfully!")
到这里,windows启动时,会默认打开该脚本,建议打开的命令行窗口不要关闭(资源占用极小),让它一直运行。这样的话,wsl2 的ip不管怎么变,都能自动同步。
设置windows防火墙
防火墙开启时,wsl2是ping不通windows的。
防火墙设置办法
实在不行,将windows防火墙全部关闭,先跑通流程再说。
wsl2设置普通用户sudo时免密
由于wsl2脚本中使用sudo命令,如果需要输入密码的话,很不方便,所以需要先设置sudo 免密,
ubuntu普通用户设置sudo免密
设置ubuntu终端开启时自动运行wsl2客户端脚本
-
vim ~/.bashrc
-
在最下方加上
-
python3 ~/.my_init_sh/WSL_IP_UBUNTU.py
-
cd ~ && mkdir .my_init_sh
-
cd .my_init_sh
-
在.my_init_sh目录下放置如下python脚本(WSL_IP_UBUNTU.py)
注意: 如下脚本只需要修改windows的ip,详情看注释。
# WSL_IP_UBUNTU.py
import os
import sys
import re
import socket,time
def command(command):
f = os.popen(command)
lines = f.readlines()
return lines
def get_ubuntu_ip():
lines = command("ifconfig")
strip_line = lines[1].strip()
split_list = strip_line.split()
print(split_list[1])
return split_list[1]
def is_ok(lines):
for line in lines:
if re.findall("done", line):
return True
return False
def start_ssh():
lines = command("ps -e | grep sshd")
if len(lines) == 0:
ret_lines = command("sudo service ssh start")
if is_ok(ret_lines):
print("sshd start success!")
return True
elif len(lines) >= 1:
print("sshd is running!")
return True
print("sshd start failed!")
return False
def sync_ip():
# 如下ip需要修改为你的windows的固定ip。仅仅需要修改这里。
ip_port = ('192.168.1.105', 9999)
s = socket.socket() # 创建套接字
s.settimeout(2)
while True:
try:
s.connect(ip_port) # 连接服务器
except Exception:
print("连接windows服务期失败!一秒钟后重试!", flush=True)
time.sleep(1)
continue
break
print("connect windows success! sync ip ing.....")
ubuntu_ip = get_ubuntu_ip()
s.sendall(ubuntu_ip.encode())
try:
server_reply = s.recv(1024).decode()
except Exception:
print("receive windows msg error!")
s.close()
return
if server_reply == "sync":
print("sync ip success!")
else:
print("windows sync failed!")
s.close() # 关闭连接
if __name__ == '__main__':
print("---------------start sync ip!------------------")
ret = start_ssh()
if ret:
sync_ip()
print("---------------end sync ip!--------------------")
到此,每次打开wsl2的bash终端时,都会运行如上脚本,它会自动将wsl2的ip发往windows端,将ip进行同步。
结尾
现在可以重启电脑试试!
若有问题,欢迎留言,我有空的时候会回复的!