前言

本人的需求是经常需要将自己的台式机作为服务器使用,但是工作的主力又是笔记本,在公司使用服务器,在家使用台式机,笔记本台式同步代码数据很麻烦,于是产生了这种需求。

利用台式机的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种:

  1. 固定wsl的ip
  2. 自动化重新进行端口映射

方法一我找了很多办法始终不能成功,都有各种问题无法实现,于是转而进行第二种思路。

(如果有靠谱的方法一,麻烦教我一下哈哈)

友情提示:此处的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)

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐