从Windows 10远程连接WSL2 Ubuntu的SSH访问

10

我对这个业务还比较陌生,不太明白如何从我的win10电脑通过SSH连接到已安装的wsl2 ubuntu 20.4。

基本上,我按照这个教程操作,但是我一直收到以下错误:

  • 当我尝试使用public端口进行SSH连接(使用curl ifconfig.me),会出现“连接超时”错误。

  • 当我尝试使用private端口进行SSH连接(使用ip route get 1.2.3.4 | awk '{print $7}')时,它会给我“权限被拒绝”的错误。

有时我会收到“sshd:no hostkeys available -- exiting”错误,所以我按照这个修复方法进行了修复,但是之后又遇到了上述错误。我应该从/etc/ssh文件夹中删除任何内容吗?

最终目标是在vs-code中通过SSH连接,但我想一旦我能够从PowerShell完成连接,那么从vs-code完成也是一样的。

2个回答

7
看起来您需要进入/etc/ssh/sshd_config(使用sudo权限),并更改以下行:
  • ChallengeResponseAuthentication yes
  • PasswordAuthentication yes

它可以工作! 在WSL中也是如此:sudo service ssh restart 如果是Ubuntu WSL。 - Carl Lee

5

鉴于你似乎已经解决了ssh的问题,我建议你使用Microsoft的"Remote Development"扩展包来实现你的最终目标(从VSCode远程连接WSL),其中包含了多个扩展。虽然你似乎在考虑使用“Remote - SSH”扩展,但你也可以直接使用“Remote - WSL”扩展。

安装扩展包或者直接安装WSL扩展后,只需要打开你的WSL实例,在代码所在的目录下输入cd命令,然后输入code .(包含句点)。这将打开VSCode并在WSL实例中安装一个shim,以允许两者之间进行通信。

更多详细信息请参见Microsoft的文档

此外,关于你最初提出的问题,你说你编辑了sshd_config以允许密码验证(我认为ChallengeResponseAuthentication的更改是不必要的)。这是一种方法,但最终我建议生成一个SSH密钥对,将私钥复制到诸如C:\Users\yourid\.ssh\id_rsa之类的位置,并使用它而不是密码登录。

你还提到你无法访问公共端口上的SSH。这是因为WSL2不进行NAT,因此它也无法从第二台计算机访问,除非进行(大量的)额外努力(从Windows到WSL的手动端口转发,每次重启后都必须重新设置,因为WSL接口地址会发生变化)。

正如你已经发现的那样,WSL接口地址是可用的,但要记住它在每次Windows重新启动时都会改变(严格来说,在关闭和重新启动WSL子系统时都会改变)。我认为,你最好使用127.0.0.1或localhost。

但是,我实际上更喜欢远程访问WSL的方法是在Windows 10上安装OpenSSH,端口22。然后你只需要像这样做:ssh -t windowsusername@mycomputername.local wsl 就可以访问WSL实例了。甚至可以通过ssh -t windowsusername@mycomputername.local wsl -d WSLInstanceName来访问你的多个WSL实例。

当然,如果你使用这种技术,并且仍然想在WSL实例中运行一个SSH服务器,你需要使用不同的端口。但我认为,在WSL下运行SSH时,你应该这样做。否则,你可能会在某个时间点上启动第二个WSL实例并遇到端口冲突。

缺点是Windows OpenSSH->WSL hack不能让你通过SSH运行像VSCode这样的应用程序,但它确实提供了通过SSH超简单地访问WSL,并且可以远程(如果你需要的话)。


谢谢你的回答,ssh-wsl和remote-ssh有什么区别吗? - Killerz0ne
就扩展而言,有“Remote - WSL”和“Remote - SSH”。WSL特定版本根本不需要SSH,也不需要任何额外的配置。它还可以做一些额外的“魔法”,比如为像nodemon(和其他)这样的东西启用inotify支持,在没有它的情况下在WSL2上很难实现。出于这些原因,我更喜欢它用于此用例。当访问远程计算机上的源代码时,例如在VM或云中(例如EC2实例),您将想要使用“Remote - SSH”。 - NotTheDr01ds

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接