SSH到远程Windows+远程WSL的解决方案

您所在的位置:网站首页 ssh和shell SSH到远程Windows+远程WSL的解决方案

SSH到远程Windows+远程WSL的解决方案

#SSH到远程Windows+远程WSL的解决方案| 来源: 网络整理| 查看: 265

一直以来有在校园网(局域网)环境下,远程连接使用实验室的Windows台式机以及同一台电脑WSL2的需求。最早是参考知乎@Silence 的方案

,即修改注册表的默认shell的方案。但是这样做就只能使用WSL2而不能使用Windows本体了,所以一直在寻找一个能两个都能用的方法。最近折腾了一段时间,感觉终于把这个事情折腾明白了,于是记录:

主要部分参考了这篇回答:1. Windows 安装OpenSSH服务器

相关教程很多,随便贴一个中文教程。要点在于安装新功能后,修改配置文件%PROGRAMDATA%/ssh/sshd_config(端口号,禁用管理员账号等),修改%userprofile%/.ssh/authorized_keys配置公钥登录,用net命令开启服务。

这里成功后,可以SSH到Windows(默认是CMD shell)。

2.A WSL不安装SSH服务器的方法(不推荐,理论可行)

在本机%userprofile%/.ssh/config中,写入类似这样的配置(尖括号内填入对应IP端口用户等信息):

Host remote_win remote_wsl HostName User Port Host remote_wsl RequestTTY force RemoteCommand bash.exe

这样直接ssh remote_wsl可以进入bash命令行,ssh remote_win则可以直接进入cmd。RemoteCommand表示连接后立刻执行命令,RequestTTY则强制请求一个终端(如果不加这个设置,得到的是一个没有prompt的bash shell,倒是能用)

(未实践)如果需要VSCode支持,可能需要在设置中打开Enable RemoteCommand,否则VSCode是会默认用-o RemoteCommand=none复写你的配置。

问题:

(2023.4.5)据说微软商店中的WSL的内测版本有BUG,SSH中无法执行WSL, bash这类命令(比如我调配置中途手贱更新了一下,现在我ssh后执行bash会给我返回一大堆????????,wsl提示无法访问)。从本机进入WSL不受影响。如果存在这个BUG,这种方法失效。BUG如图所示

RemoteCommand和很多基于SSH的软件冲突,比如无法访问远程WSL上rsync(可以--rsync-path='wsl rsync'绕过),scp也不能自动补全,总之体验像是残疾的SSH2.B WSL也安装SSHD服务器(推荐)

本质是利用ProxyJump功能把远程Windows SSH当跳板机。

在WSL安装SSH Server (sudo apt install openssh-server,有可能需要卸载后重装) 在/etc/ssh/sshd_config里面修改配置,在~/.ssh/authorized_keys里配置公钥,注意这里对应的公钥应该是远程Windows那里的私钥对应的公钥,因为本质上是在远程机上登录WSL的SSH。另外,端口号不要和Windows的SSH端口一致。

启用WSL的SSHD功能service ssh start,可以考虑假如/etc/wsl.conf以保证开机启动,参考这篇回答

如果是WSL1,WSL和宿主是同一个网络。如果是WSL2,其网络是被NAT到一个内网上,外部是无法直接访问的,但是WSL2本身提供了localhostForwarding功能(忘记默认是不是打开的了,可能需要在%userprofile%/.wslconfig文件中添加localhostForwarding=true后重启wsl),可以直接将WSL对应端口转发到宿主机对应端口。ProxyJump的好处是不用再开一个防火墙,因为Windows到WSL本身就是内网。

这种情况下,一个选项是防火墙允许外部访问WSL的SSH端口。另一个选项是config中配置ProxyJump,比如:

Host remote_win HostName User Port Host remote_wsl ProxyJump remote_win User Port HostName 127.0.1.1 UserKnownHostsFile ~/.ssh/known_hosts_remote_wsl

这里我将UserKnownHostsFile重定向到另一个文件,是因为这是localhost会记录在known_host里,如果有多个WSL的HOST,这样可能会导致SSH报安全错误(参考了这个)。remote_wsl的HostName理论上可以填任意的回环地址,但好像填localhost会有问题,这可能是因为Windows和Ubuntu对localhost的理解不同,参考这个

此时,远程WSL和Windows应该都能正常使用了,VSCode可用,rsync等可用。

坑1. 权限问题

Linux系统上,.ssh目录下的authorized_keys应该是只有属主能访问(600),但是Windows上,属主除了登录的用户还必须包括SYSTEM,不然连接时会报Permission Denied(中间看了某个教程被误导改了Windows上authorized_keys的属主权限……现在我也找不到那个教程链接了)

2. WSL的BUG:无法访问/??????

之前也提过了,如果有这个BUG那么就杜绝了一切先登录cmd再登录wsl的方案。ProxyJump是可行的。

3. localhostForwarding 失败(可以通过WSL的实际IP进入SSH,但回环地址不行)

Github上有汇报类似issue,似乎是因为这个代理有过时的缓存没删掉。具体来说首先在WSL执行ifconfig获取WSL的IP,然后执行

netsh interface portproxy show v4tov4

看是否返回了不同IP的条目。如果是,你可能需要用类似netsh interface portproxy delete和netsh interface portproxy add这样的语句手动更新WSL的IP。



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3