WSL2 ubuntu ip 自动同步 、静态ip(解决wsl2 ip 每次开机ip会变化的问题) 您所在的位置:网站首页 开机自动启动wsl WSL2 ubuntu ip 自动同步 、静态ip(解决wsl2 ip 每次开机ip会变化的问题)

WSL2 ubuntu ip 自动同步 、静态ip(解决wsl2 ip 每次开机ip会变化的问题)

2024-07-12 21:19| 来源: 网络整理| 查看: 265

找到了更简单的办法,详情wsl2 ubuntu ip 自动同步到windows端的vscode remote ssh(wsl2 ubuntu 静态ip 固定ip)

如下内容仍然可行,不过比较麻烦。 ———————————————————————————————————————————————————————— ​ 利用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进行同步。

结尾

现在可以重启电脑试试!

若有问题,欢迎留言,我有空的时候会回复的!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有