问题来源
这么做主要就是因为寝室有台性能还不错的台式机,但是平常又想出去办公,写代码完全用不到图形化界面,所以就想搞一个映射出来,让外面的机子可以通过ssh访问到主机。
然后就是我又想用linux又下不定决心装一下双系统,刚好Window目前子系统方案还算完善(但是坑还是一堆,真的是一堆,以后有钱了,单独买个服务器,主要显卡还想玩玩游戏),所以果断选一个版本安装一下。
主要步骤
1.启用WSL
首先你得启用相关的WSL的配置,具体的操作可以访问以下链接
https://learn.microsoft.com/zh-cn/windows/wsl/install
如果wsl安装好,即可看到如下界面。
然后根据命令可以直接选取Ubuntu安装,我这里因为开发环境较熟悉Ubuntu20.04所以就安装的Ubuntu20.04
然后进入WSL当中,输入
wsl
即可进入新安装好的系统
但是这里你可以看到很坑啊,这里你的访问过程是从window的路径进去的。子系统会把整个当前Windows当作一个挂载(MNT),所以你这时候可能能在这里访问到所有你在windows下安装的驱动,但是在Linux系统目录本身,你就需要再做准备。比如Nvidia的驱动,就需要在Linux系统下建立环境变量的映射。
ok到这一步,如果你不用图形界面的话,基本就完成了。我一般拿来跑程序,所以基本不用图形界面。下面直接配置ssh
配置SSH
这一步如果你是第一次做可能有点坑。
你需要先打开你的sshd_config
设置
PasswordAuthentication Yes #并激活密码登录ssh
PubkeyAuthentication Yes #激活公钥登录
基本上这个服务器也就我自己在用,so…这里我习惯把两个都打开。主要别人也不知道我做的端口映射。
然后重启ssh
sudo service ssh restart
噢如果你这些命令都报错,麻烦你先安装一下,openSSH服务器
sudo apt install openssh-server
开放端口和IP给客户端使用
继续修改sshd_config
/etc/ssh/sshd_config
...STUFF ABOVE THIS...
Port 2222
#AddressFamily any
ListenAddress 0.0.0.0
#ListenAddress ::
这个设置的意思就是开放2222端口以及绑定到主机的广播地址进行侦听。这里端口可以更换,但是后面我做IP映射的时候你也得给我换咯。
然后重启ssh
sudo service ssh restart
然后这时候你可以使用
ifconfig
命令查看IP就能使用ssh连接了
但是这样每次不是都要打开wsl才能链接服务器嘛?
所以我写了一个python程序,将其绑定到主机的ip
import os
import ctypes, sys
def is_admin():
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False
os.system("wsl ifconfig > output_wsl.txt")
with open("output_wsl.txt","r") as f:
ipaddr=f.readlines()[1].split(" ")[9]
if is_admin():
os.system("netsh int portproxy reset all")
os.system("netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=2222 connectaddress={} connectport=2222".format(ipaddr))
os.system("netsh advfirewall firewall add rule name=\"Open Port 2222 for WSL2\" dir=in action=allow protocol=TCP localport=2222")
os.system("netsh interface portproxy show v4tov4")
os.system("wsl sudo service ssh start")
else:
# Re-run the program with admin rights
ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
所以这里面要读取wsl的IP绑定到台式机IP上
然后就是使用SSH链接他