背景
如题,这是一个有点tricky的事情,目前网上有很多教你如何配置的文章。
但是随着每次重启计算机,WSL2的nameserver都会变,难道每一次都需要重新配置一遍吗?
我不!
故催生了本文
WSL端
第一次在WSL1/2使用ssh时,需要做如下配置,方便起见综合成了一个一键脚本(只需要配置一次)
注意!下文所更改的端口号是 2234,也就是说WSL端监听的端口号是2234,而不是默认的22了。你可以改成你喜欢的数字。
# 在WSL2中运行的一键脚本
sudo apt remove openssh-server -y #卸载 ssh 服务
sudo apt install openssh-server -y # 重装 ssh 服务
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak # 备份
sudo sed -i 's/#Port 22/Port 2234/g' /etc/ssh/sshd_config # 替换目标内容
sudo sed -i 's/#ListenAddress 0.0.0.0/ListenAddress 0.0.0.0/g
' /etc/ssh/sshd_config
sudo sed -i '/#PermitRootLogin prohibit-password/a\PermitRootLogin yes' sshd_config # 在某行下新增
sudo sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g
' /etc/ssh/sshd_config
sudo service ssh restart
Windows端(powershell脚本)
每次计算机重启,都会改变WSL2的nameserver,所以每次计算机重启都需要重新配置一次Windows端的转发,即运行一次下述脚本即可。(可以把该脚本的运行加入到Windows的 任务计划 中设置为开机自启)
注意!
- 下面所设置的
wsl2PORT
端口需要和上面WSL中监听的一致 - 下面所设置的
wsl2Name
可以在 powershell 中使用wsl -l
来查看 - 下面设hi的
listenPORT
是windows监听的端口,及远程访问这台Windows电脑时连接的端口
# 获取管理员权限
If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]"Administrator")) {
$arguments = "& '" + $myinvocation.mycommand.definition + "'"
Start-Process powershell -Verb runAs -ArgumentList $arguments
Break
}
$wsl2Name = "ubuntu20-wsl2" # 设置WSL2镜像的名字
$wsl2PORT = 2234 # 设置WSL2中sshd中的端口
$listenPORT = 2224 # 设置windows监听的端口,访问windows该端口将转发给WSL2中的上面那个端口
# 获取WSL2的eth0的IP地址
wsl -d $wsl2Name sudo service ssh --full-restart
$wsl2inet = wsl -d $wsl2Name ifconfig | Select-String -Pattern "inet.*?(?<ip>[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}).*?net"
$wsl2ip = $wsl2inet.Matches[0].Groups.Item("ip").Value
# 设置windows到WSL2的端口转发
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=$listenPORT connectaddress=$wsl2ip connectport=$wsl2PORT
# 打开防火墙,放行外部访问本机的流量
netsh advfirewall firewall add rule name=WSL2 dir=in action=allow protocol=TCP localport=$listenPORT
设置Windows任务计划
将使用Powershell执行该脚本加入到Windows的任务计划,以实现开机自启,这样就可以再也不用记得(考虑)这件事了。
把该脚本保存为 .ps1 文件,存放在任意地点。然很找到Windows的任务计划(开始菜单栏搜索“任务计划程序”),添加新的计划,触发器栏设置为开机启动。需要注意的是:
- 常规栏,给权限“使用最高权限运行”
- 操作栏,程序或脚本处填写 powershell 的位置:开始菜单栏搜索 powershell,右键打开其位置,右键powershell快捷方式打开其位置,将此时找到的powershell位置(应该是 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe )填写到该处。把本文的 .ps1 脚本文件的路径(比如笔者的是 C:\Application\AutoRun\重置WSL2IP.ps1)填写到下面那个空即可。
完成设置后可以右键任务计划启动试试,如果没问题的话,就可以试着SSH到WSL2上了。
最后
祝一切顺利~