• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
Gk_zheng
帮助1

找到了更简单的办法,详情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客户端脚本

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

结尾

现在可以重启电脑试试!

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

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhfkajeg
系列文章
更多 icon
同类精品
更多 icon
继续加载