您现在的位置是:首页 >学无止境 >wsl2 ubuntu ip 自动同步到windows端的vscode remote ssh(wsl2 ubuntu 静态ip 固定ip)网站首页学无止境

wsl2 ubuntu ip 自动同步到windows端的vscode remote ssh(wsl2 ubuntu 静态ip 固定ip)

Gk_zheng 2024-06-14 17:17:00
简介wsl2 ubuntu ip 自动同步到windows端的vscode remote ssh(wsl2 ubuntu 静态ip 固定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地址了,还算比较方便。

方案概览

wsl2的bash开启时自动执行python脚本,将ubuntu中最新的ip写入vscode的remote ssh的config文件中。

每次打开一个bash,都会同步一次。

注意事项

1、remote ssh 的config文件中wsl2远程连接的配置中的ip地址必须在第二行,且HostName前是四个空格。如下图所示

2、每次打开一个wsl2中的ubuntu终端,都会自动同步一次。
3、将ubuntu终端设为windows开机默认打开。(必须主动打开ubuntu 终端,才会自动同步)

4、直接在wsl2的ubuntu访问、修改windows中的vscode remote ssh的config。windows的盘符都挂载在/mnt下。

需要解决如下几个问题。

1、需要在wsl2中ubuntu设置普通用户sudo时 免密登录。
比如 sudo service ssh start 时,不需要输入密码
2、wsl2中的ubuntu需要安装python3

sudo apt install python3

好吧,下面正式开始操作!

wsl2设置普通用户sudo时免密

由于wsl2脚本中使用sudo命令,如果需要输入密码的话,很不方便,所以需要先设置sudo 免密,

ubuntu普通用户设置sudo免密

设置ubuntu终端开启时自动运行wsl2同步ip脚本

  1. vim ~/.bashrc

  2. 在最下方加上
    python3 ~/.my_init_sh/WSL_IP_UBUNTU.py

  3. cd ~ && mkdir .my_init_sh

  4. cd .my_init_sh

  5. 在.my_init_sh目录下放置如下python脚本(WSL_IP_UBUNTU.py)

    注意: 如下脚本只需要修改config文件目录,详情看注释。

# WSL_IP_UBUNTU.py
import os
import re

# 请修改这行!仅仅需要修改这行!    改为您的config文件目录
config_file = "/mnt/c/Users/82383/.ssh/config"

def writefile(content):
    f = open(config_file,"w")
    for line in content:
        f.write(line)
    f.close()

def command(command):
    f = os.popen(command)
    lines = f.readlines()
    return lines

def get_config():
    f = open(config_file,"r")
    lines = f.readlines()
    strip_line = lines[1].strip()
    split_list = strip_line.split()
    ubuntu_ip = split_list[1]
    print("origin config ip = ", ubuntu_ip)
    return  lines

def get_ubuntu_ip():
    lines = command("ifconfig")
    strip_line = lines[1].strip()
    split_list = strip_line.split()
    print("now ubuntu ip    = ", 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():
    ubuntu_ip = get_ubuntu_ip()
    lines = get_config()
    lines[1] = "    HostName {}
".format(ubuntu_ip)
    writefile(lines)
    print("set vscode remote ssh config ip successfully [{}]".format(config_file))
    

if __name__ == '__main__':
    print("---------------start sync ip!------------------")
    ret = start_ssh()
    if ret:
        sync_ip()
    print("---------------end sync ip!--------------------")


到此,每次开启一个ubuntu bash,都会自动同步ip一次。

验证

在powershell中使用 wsl --shutdown,关闭ubuntu,然后新打开一个ubuntu bash,就自动同步了。
在这里插入图片描述

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。