环境信息
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脚本
-
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)
注意: 如下脚本只需要修改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 {}\n".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,就自动同步了。