Win11将WSL做SSH服务器,实现通过局域网SSH远程连接到WSL上,并且开机自动启动,手把手教学
前言
本人的需求是经常需要将自己的台式机作为服务器使用,但是工作的主力又是笔记本,在公司使用服务器,在家使用台式机,笔记本台式同步代码数据很麻烦,于是产生了这种需求。
利用台式机的WSL搭建SSH服务器,局域网内笔记本可直接ssh连接到WSL上,这样就可以通过SFTP同步数据(局域网外做下内网穿透应该也可以,还没试过),下面开始正文。
第一部分:在WSL上安装OpenSSH
首先重装OpenSSH,在WSL中执行如下命令:
sudo apt-get remove openssh-server
sudo apt-get install openssh-server
卸载自带的旧版本,安装新版本。
修改配置文件:
sudo vi /etc/ssh/sshd_config
将下面三项设置成:
- Port 22
- PermitRootLogin Yes
- PasswordAuthentication Yes
如果没有的话自己添加一下。
运行这个命令:
sudo vim /etc/hosts.allow
添加一行:sshd:ALL
然后重启ssh服务:
sudo service ssh --full-restart
在WSL中查看ip,在终端输入ifconfig:
注意是在WSL中,不是win中的ipconfig,两者看到的ip是不一样的!win中看到的是win在WSL网络中的地址,但我们现在要的是WSL在WSL网络中的地址。
然后在win中以管理员身份运行cmd,输入下面的命令:
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=22 connectaddress=172.19.247.91 connectport=22
将这里的connectaddress后面的ip就是上面查询到的ip地址,换成你自己的就行了。实现端口映射,从而可以通过win的局域网ip直接连接到wsl
在win中运行ipconfig查看本机内网ip:
现在即可通过ssh实现从外部设备的连接:
ssh root@192.168.0.2
注意,这里的ip是win的局域网地址,但是前面的root是wsl中的用户名,是通过win的转发实现的连接,不是直接连接的wsl中的地址。此处需要防火墙开放端口22,方法见链接:(33条消息) Windows怎么让防火墙开放端口_windows开放1688端口_克豪的博客-CSDN博客
到这里第一部分已经完成了,已经能够实现从笔记本上直接ssh到wsl了,不妨先试一下。
但是问题是如果这样连接,每次重启电脑或者重启wsl都会导致我们使用ifconfig查询的wsl的ip变化,并不固定!那我们通过netsh实现的端口映射就会变成每次都需要重新使用新的ip运行命令!这不能忍!于是解决方法有如下2种:
- 固定wsl的ip
- 自动化重新进行端口映射
方法一我找了很多办法始终不能成功,都有各种问题无法实现,于是转而进行第二种思路。
(如果有靠谱的方法一,麻烦教我一下哈哈)
友情提示:此处的win的ip也是会变化的,这样每次ssh都需要不同的ip会比较麻烦,可以固定住win的局域网ip,这个比较简单网上教程比较多,请自行查找,我是直接在路由器里就可以改了,比较方便。
第二部分:自动端口映射
在WSL的/etc/profile中添加如下命令:
ipaddr=$(ifconfig eth0 | grep 'inet ' | awk '{print $2}')
sed -i '/wslhost/d' /mnt/c/Windows/System32/drivers/etc/hosts
echo "$ipaddr wslhost" >> /mnt/c/Windows/System32/drivers/etc/hosts
该文件会在每次wsl系统启动的时候自动运行,将在wsl中查询到的ip自动发送到win中的hosts文件中,并为其指定域名wslhost(你也可以改成别的名字,你喜欢就好),之后可以通过wslhost代替ip使用。
hosts文件在:"C:\Windows\System32\drivers\etc\hosts"
该命令会修改hosts文件,因此需要较高的权限,直接修改etc文件给予权限:
右键etc文件夹,属性-安全-高级-更改,填入Users,确定后返回。然后选择编辑,选中Users,勾选完全控制。
然后重启wsl(可以在powershell中执行wsl --shutdown关闭,然后重新打开一个wsl终端就行了,或者原终端中直接enter,会有提示的),查看hosts文件,就会发现多出这一行,即配置成功:
到这里我们就实现了自动将wsl的ip分配给域名wslhost使用(在wsl启动的时候),这样我们上面使用的netsh命令可以使用wslhost代替ip使用,那么接下来就需要实现开机自动启动wsl和wsl中的openssh服务即可。
第三部分:开机后台自启动WSL
按下win+r,输入shell:startup
创建一个txt文件,写入如下内容后更改后缀为vbs
CreateObject("Wscript.Shell").run "wsl -d Ubuntu-20.04 -u root -e /etc/init.d/ssh start",vbhide
wscript.sleep 1000 * 10
Set Shell=CreateObject("Shell.Application")
Shell.ShellExecute "cmd.exe","/c netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=22 connectaddress=wslhost connectport=22","C:\Windows\System32\","runas",0
其中第一行负责启动wsl同时开启ssh服务,vbhide可以使得启动的wsl在后台进行,不显示终端。
第二行需要进行一定的延时,其中10就是十秒,可以根据自己的机器情况进行修改,估计5秒就够了。延时是因为代码的运行很快,接下来就会运行cmd进行端口映射,但是当已经运行完netsh的时候wsl可能还没有启动,导致端口映射依然是上次关机时候的wsl的ip,所以需要延时几秒钟再执行。
第三、四行就是执行nesth的命令,将connectaddress后的ip地址用域名wslhost替换,‘runas’参数以管理员身份运行cmd,后面的参数0表示隐藏窗口后台执行。
但是,众所周知,每次以管理员身份执行cmd的时候,都会弹框让用户确定“是”,“否”。需要进一步隐藏。打开设置,在左上角搜索框搜索管理员,选择更改用户账户控制设置,然后拉到底哈哈。
大功告成!
参考:
如何用笔记本ssh连接局域网内其他电脑上的wsl2 ubuntu - 知乎 (zhihu.com)
(33条消息) Windows怎么让防火墙开放端口_windows开放1688端口_克豪的博客-CSDN博客
(33条消息) Win 开机自动启动 WSL 服务_wsl 启动_ghimi的博客-CSDN博客
(33条消息) WSL2 配置SSH 设置开机自启_wsl2开机自启_0oljyo0的博客-CSDN博客
(33条消息) windows命令行下用netsh实现端口转发(端口映射)_windows 端口映射_Hookswork的博客-CSDN博客
(33条消息) 在Windows中动态获取WSL2中的IP地址_如何查看wsl的ipo_codezrh的博客-CSDN博客Win10系统下关闭管理员运行确认弹窗 - Ganda1f - 博客园 (cnblogs.com)
更多推荐
所有评论(0)