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

news2024/10/7 2:32:08


利用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客户端脚本

  1. vim ~/.bashrc

  2. 在最下方加上

  3. python3 ~/.my_init_sh/WSL_IP_UBUNTU.py
    
  4. cd ~ && mkdir .my_init_sh

  5. cd .my_init_sh

  6. 在.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进行同步。

结尾

现在可以重启电脑试试!

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/502733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vue项目使用element-ui

最近新建一个vue项目,配置了element-ui,较之前使用时发生了些许变化,对新的配置方式进行记录 node版本 v14.21.3 npm版本 v6.14.18 vue版本 v2.6.14 element-ui版本 v2.15.13 创建项目vue项目,使用…

设计原则之【迪米特法则】

文章目录 一、什么是迪米特法则1、理解迪米特法则2、如何理解“高内聚、松耦合”? 二、实例1、实例12、实例2 一、什么是迪米特法则 迪米特原则(Law of Demeter LoD)是指一个对象应该对其他对象保持最少的了解,又叫最少知道原则&…

Navicat自动提交的开和关

使用Navicat时,若是自动提交是打开状态,就相当于是自动执行了commit操作,就无法进行回滚操作。 一.相关指令 1.查询Navicat的自动提交开关状态: -- 查询自动提交 ON:是自动提交,即commit ;OFF:不是自动提交&#xf…

Java-注解

文章目录 前言一、概述二、元注解TargetRetentionDocumentedInherited 三、自定义注解四、常用内置注解OverrideDeprecatedSuppressWarnings 前言 注解用于修饰包、类、方法、属性、构造器、局部变量等数据信息,它可以用于创建文档,跟踪代码的依赖性&am…

怎么在VMware ESXi添加NAS存储?

案例:需要将NAS添加到VMware ESXi “我的本地空间不是很多,虚拟机占了我很多空间,但是我有一个NAS,所以我想问一下有没有办法可以让VMware ESXi添加NAS存储来扩展空间?” 网络附加存储(NAS)设…

2023年6月CDGP数据治理专家认证考试,5月报名及学习

目前6月DAMA-CDGP数据治理专家认证考试开放报名地区有:北京、上海、广州、深圳、长沙、呼和浩特。 目前南京、济南、西安、杭州等地区还在接近开考人数中,打算参加6月考试的朋友们可以抓紧时间报名啦!!! DAMA认证为数据…

为什么每个有影响力的内容创作者都需要一个Kadence WordPress网站

创作者经济正在蓬勃发展,内容创作者正在以前所未有的方式建立受众和收入来源。无论您是在 YouTube、Instagram、TikTok 还是任何其他平台上增加受众,充分利用这些受众变得越来越重要。 Adobe 于 2022 年 8 月发布的一项研究表明,过去 2 年全…

关于加强珠宝玉石类小程序把控的公告

各位小程序开发者为进一步加强小程序的规范管理,保障用户合法权益,平台将对珠宝玉石类小程序加强把控,具体内容如下: 一、 【商家自营-珠宝玉石】类目资质调整 备注:若小程序涉及经营随形加工的原石或摆件相关服务&…

Vue入门简介【第一篇】

大纲 一、Vue介绍 🌴 1.1 什么是Vue vue是一个构建用户界面UI的渐进式javascript框架,渐进式的框架是指可以一步一步的由浅入深的去使用该框架。 vue官网: https://cn.vuejs.org/ 🌴 1.2 Vue的优点 ⭐️ 1、体积小 压缩后33…

大数据分析就业班课程大纲

大数据分析就业班课程大纲列举: 第一阶段 Mysql从入门到精通/Python从入门到精通课程模块课程内容 MySQL 数据库 数据库概念及其功能介绍、数据库的安装与配置、数据库表的创建及注意事项、数据库的增、删、改、查等操作、多表的关系及查询、多表的…

OSI七层模型中的MAC和PHY

最近做服务器项目在学习MAC和PHY,总结了一些知识点,拿来分享一下 说到MAC和PHY首先要提到OSI七层模型 OSI七层模型 TCP/IP四层模型 对应网络协议 应用层(Application) 应用层 HTTP、TFTP, FTP, NFS, WAIS、SMTP 表示层&…

【Python入门知识】NumPy 数组排序/过滤,案例+理论讲解

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 数组排序 排序是指将元素按有序顺序排列。 有序序列是拥有与元素相对应的顺序的任何序列,例如数字或字母、升序或降序。 NumPy ndarray 对象有一个名为 sort() 的函数,该函数将对指定的数组进行排…

功率放大器在Lamb波信号波包模型验证研究中的应用

实验名称:窄带激励条件下的兰姆波时域信号参数估计研究 研究方向:Lamb波 测试目的: 基于Lamb波的二阶频散理论,提出了时域信号的波包模型,为全文奠定理论基础。模型考虑两种情况:初始激励以单模态传播和…

【面试】说说什么是 Java 内存模型(JMM)?

文章目录 一、 为什么要有内存模型?1.1. 硬件内存架构1.2. 缓存一致性问题1.3. 处理器优化和指令重排序 二、并发编程的问题三、Java 内存模型3.1. Java 运行时内存区域与硬件内存的关系3.2. Java 线程与主内存的关系3.3. 线程间通信 四、总结 一、 为什么要有内存模…

Java阶段二Day16

Java阶段二Day16 文章目录 Java阶段二Day16SSMSpringBoot简述核心特性创建SpringBoot工程创建工程失败排查 MyBatis框架-注解管理概述MyBatis环境初始化整合MyBatisPojo对象设计Dao接口设计 SSM Spring:Spring是一个轻量级的容器和框架,为开发者提供了一…

沃通“SSL证书+代码签名证书”,防范高仿“钓鱼网站+钓鱼软件”攻击

近日,360发布威胁预警,因监测发现多起利用钓鱼网站对特定用户进行攻击的安全事件,呼吁警惕“高仿”软件安装程序暗藏钓鱼木马。“钓鱼网站钓鱼软件”是非常典型的钓鱼攻击组合,而沃通“SSL证书代码签名证书”能够帮助企业建立安全…

一文带你直观感受,BPM管理系统如何在低代码平台实现搭建

BPM系统(英文全称:Business Process Management,翻译后简称BPM)即业务流程管理系统,是指对端到端业务流程进行建模、分析和优化,用以实现战略业务目标,其特点是注重流程驱动为核心,实…

通过修改根证书绕过rustls的证书固定机制,抓包解密ssl流量

例子,cloudflare的warp-svc.exe。抓包获取密钥。 用proxifier尝试了一下强行代理,无效,因为proxifier是通过Hook Socket函数方式实现的,但这个程序可能没有用Socket函数进行通信。 之后发现通过nekoray基于gvisor的VPN白名单模式全…

《计算机网络——自顶向下方法》精炼——3.1-3.4.1

“生命在于运动,学习在于不断尝试。”——亚里士多德 文章目录 运输层概述与服务运输层功能运输层概述IP协议UDP和TCP协议 多路复用与多路分解UDPUDP相较于TCP的优点UDP报文段结构检验和可靠数据传输构造可靠数据传输协议 运输层概述与服务 运输层为应用层提供了逻…

2022年宜昌市网络搭建与应用竞赛样题(二)

网络搭建与应用竞赛样题(二) 技能要求 (总分1000分) 竞赛说明 一、竞赛内容分布 “网络搭建与应用”竞赛共分三个部分,其中: 第一部分:网络搭建及安全部署项目(500分&#xff0…