开篇

我们都知道,wsl安装完成后,通过命令行输入wsl即可进入系统,但是Windows cmd窗口真的不太友好,那么,我们有没有办法通过xshell等sshclient工具来进行连接进行操作呢?那么,本篇我们一起来学习一下吧。
那么,这里我们一般有2种方式来建立ssh连接。

ssh client连接

(一)生成密匙

这里需要注意的是,如果wsl不存在ssh服务,则直接跳到第二种方式进行操作,如果存在,建议先执行该种方式进行体验,若不成功,则再跳到第二种方式将会更明白个中道理。

一般wsl自带ssh服务,首先我们启动服务

service ssh restart

此时可能报错

sshd: no hostkeys available -- exiting.

这里可能有2种原因,一是当前用户非root用户,此时切换到root用户执行即可,二是可能缺少密匙文件,可进入/etc/ssh查看是否存在下图中2个文件,若不存在,执行以下命令生成即可。

$ sudo ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key $ sudo ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key

服务启动成功后,通过命令行以下方式进行连接

ssh jack@localhost The authenticity of host 'localhost (127.0.0.1)' can't be established. RSA

即可登录,但这里是使用密匙登录,要想通过账号密码登录,则需要修改配置文件。

修改完配置文件后,通过

输入密码即可登录。

这里需要注意的是,这里既可以通过local host也可以通过ip来进行访问,并不像其他教程里所说的一样需要进行端口转发,端口转发并不是用在这种情况下的,后面会讲解。

(二)删除并重新安装sshopen-server

这种方法网上随处可见,为了全面,我这里也记录一下,基本上分为以下几步。

1.卸载openssh-server

apt remove openssh-server

2.安装openssh-server

apt install openssh-server

3.修改配置文件

# 编辑/etc/ssh/sshd_config文件。 
vi /etc/ssh/sshd_config

修改ip和port
1.jpg
修改允许root访问
2.jpg
修改允许用户名密码登录
3.jpg

4.重启

sudo service ssh restart

此时即可通过ssh进行连接或通过xshell等工具进行连接

(三)完成以上连接后,是否可以通过其他电脑来访问wsl?

毫无疑问是可以的!!!那么这步我们就需要配置防火墙出入站规则以及端口转发规则了

如果防火墙开启,那我们需要配置防火墙规则同时需要配置端口转发规则

1.配置端口转发规则

意思就是,访问到物理机的22端口的请求,转发到wsl的22端口,[IP]为wsl的ip [PORT]为wsl的端口

netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=22 connectaddress=[IP] connectport=[PORT]

2.配置防火墙出入站规则

这是安全规则,如果防火墙关闭的话则不用配置,

netsh advfirewall firewall add rule name=WSL2 dir=in action=allow protocol=TCP localport=22

配置完以上两步后,我们则可以通过外网来访问我们的wsl

(例如,本机ip是1.2.3.4,wsl地址是172.16.12.1)

那么,远程访问时,通过

ssh root@1.2.3.4 -p 22

即可连接到wsl。

网上说,要连接到wsl时,wsl必须保持打开状态,也就是命令行窗口不能关闭,其实这是一个误区!!!

经过验证,即使所有的命令行都关闭,只要wsl不是shutdown状态,ssh服务正常开启,那么就可以通过ssh进行连接!!!

其实,通过这一步可以自由的配置本地端口与wsl端口的映射,也就是可以通过物理机来进行网站或应用程序的访问,比如,我们再wsl部署一个网站,我们可以直接将该网站的端口xxxx映射到物理机的8080(举例),那么我们通过本机ip:8080即可访问该网站,大大提高我们的易操作性。

但是不是到这里就万事大吉了呢?并不是,因为wsl每次重启,ip地址都会变化,也就是说通过以上步骤添加的映射规则再wsl重启后就失效了!【刚开始不知道,第一次配置好wsl后,第二天来开机就懵逼了,一通瞎操作才整明白】,所以,我们还的想办法来固定wsl的ip地址,以保证规则永久有效。

1.首先,下载wsl2host.exe

wsl2host.exe 下载

2.管理员运行cmd,然后切换到wsl2host.exe目录下,执行

wsl2host.exe install Windows
Username: xxx Windows
Password:xxx

若不报错,则证明安装成功,打开服务,查找wsl2host查看状态,若为停止,手动启动

4.jpg

若启动失败,则打开本地组策略,进行如下设置

5.jpg

此时即可启动服务成功,打开C:\Windows\System32\drivers\etc\hosts,可以查看到

6.jpg

证明添加成功,之后,我们就再也不用担心wsl重启导致的IP变动问题了。

如果是家庭版win10,那么可以

@echo off 
pushd "%~dp0"
dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >List.txt
dir /b C:\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package~3*.mum >>List.txt
for /f %%i in ('findstr /i . List.txt 2^>nul') do dism /online /norestart /add-package:"C:\Windows\servicing\Packages\%%i"
pause

复制以上内容到一个文本***.bat中,使用管理员运行即可。

经测试,当wsl --shutdown时,hosts文件中wsl域名行会消失,当wsl启动时,会自动添加。

附:常用命令

//端口转发
netsh interface portproxy add v4tov4 listenport=80 listenaddress=0.0.0.0 connectport=80 connectaddress=172.27.156.29 //转发80端口
netsh interface portproxy add v4tov4 listenport=443 listenaddress=0.0.0.0 connectport=443 connectaddress=172.27.156.29 //转发443端口

//查看转发
netsh interface portproxy show v4tov4
netsh interface portproxy show all

//删除所有转发
netsh interface portproxy reset

//配置防火墙
netsh advfirewall firewall add rule name=WSL2 dir=in action=allow protocol=TCP localport=[端口]

//查看防火墙
netsh advfirewall firewall show rule name=WSL2
//删除防火墙
netsh advfirewall firewall delete rule name=WSL2 dir=in

最后修改:2022 年 10 月 18 日
如果觉得我的文章对你有用,请随意赞赏