如何通过SSH登录“Bash on Ubuntu on Windows 10”?

我有安装并运行的Windows 10周年纪念版,其中包括“Bash on Ubuntu on Windows”。我想能够通过SSH连接到这个Ubuntu实例,但是尽管我已经安装和配置了openssh-server(并且监听在2200端口),当我尝试ssh到“localhost:2200”时,它告诉我“服务器意外关闭了网络连接”。
有人成功完成过这个吗?

enter image description here


使用Process Hacker并查看“网络”选项卡,它显示sshd(在Windows 10上运行的Ubuntu)正在监听本地端口2200。 - Mick
如果您尝试连接到系统的IP地址呢?Ubuntu经常以与Windows不同的方式映射回环地址,并在127.0.0.0/8(通常为127.0.1.1)中使用额外的值。 - Frank Thomas
5个回答

我弄好了,这是方法。

卸载了 ssh-server,重新安装并确保它已启动。

sudo service ssh --full-restart

确保您已关闭根访问并在配置文件中添加了另一个用户。
我成功地连接到了预期的127.0.0.1:22子系统。 希望这对您有所帮助。

Here's a screenshot.

  1. sudo apt-get purge openssh-server
  2. sudo apt-get install openssh-server
  3. sudo nano /etc/ssh/sshd_config并通过设置PermitRootLogin no禁止root登录
  4. 然后在下面添加一行:

    AllowUsers 你的用户名

    如果想使用密码登录,请确保PasswordAuthentication设置为yes

  5. 通过添加/修改UsePrivilegeSeparation no来禁用特权分离

  6. sudo service ssh --full-restart

  7. 使用PuTTY等ssh客户端从Windows连接到你的Linux子系统。


这个方法有效,但我还得按照@d1val的建议设置UsePrivilegeSeparation no - Mick
3我不必这样做 - 奇怪.. 但请记住,这仍处于测试阶段,结果可能会有所不同。 - Master Azazel
8此外,我还需要做以下操作:从服务控制面板停止/禁用Windows 10 SSH服务器代理服务,并在sshdconfig中设置PubkeyAuthentication为no。 - math0ne
7我还需要添加一个防火墙规则。已经存在一个规则,但那只是针对Windows SSH服务器代理的规则,当我停止该服务时,防火墙会阻止22号端口上的流量。 - Pierre-Luc Paour
1值得注意的是,在构建14936上,这个问题会导致Windows蓝屏死机:https://github.com/Microsoft/CommandLine-Documentation/releases/tag/14936 - rmobis
1我只需要做的就是将UsePrivilegeSeparation no设置为不启用。你仍然可以使用root登录;PermitRootLogin yes正常工作。 - Milos Ivanovic
当然,从技术上讲它是有效的。我包含它是因为你不应该给予root权限。 - Master Azazel
有没有办法让它开机自启动?谢谢 ^-^ - Magix
1Linux子系统?只需将其添加到Windows启动程序中 安装后ssh应自动启动...以便与子系统一起启动 我没有测试过,不过应该可以。 - Master Azazel
@MasterAzazel 不太确定,因为当我手动启动子系统时,SSH服务器也必须手动启动:/ - Magix
http://upstart.ubuntu.com/ 这个网址应该能帮到您。 - Master Azazel
4我还必须更改端口(在/etc/ssh/sshd_config文件中的端口2222),否则Windows的SSH服务器将在22号端口接收连接。 - arod
1是的,当端口22被其他程序占用时,这就是你需要做的。 - Master Azazel
抱歉将这个帖子从死亡线上挽回,但有没有人能从不同的电脑远程操作它?我可以轻松连接到本地主机,但当我尝试从Windows 7电脑用Putty进行连接时,它就无响应。我可以轻松ping通运行Ubuntu bash的Windows 10电脑。这是你无法从计算机外部连接它的限制吗? - Patratacus
使用Windows机器的公共IP地址和子系统上SSH服务器的正确配置,我不明白为什么连接到Linux子系统会有问题。您能在本地登录到子系统吗?如果可以的话,请问是哪个端口? - Master Azazel
感谢您的回答。"卸载ssh服务器,重新安装"这个步骤是用来做什么的? - Jonathan Hartley
如果你无论使用哪个端口都突然出现了 failed: Address already in use. 错误,请尝试将 ListenAddress 的注释取消,这对我来说起作用了 - 我的笔记本电脑上运行的 Insider Preview 14986 可以在没有它的情况下正常工作,但 /etc/ssh/sshd_config 文件保持不变。 - dza
我不得不关闭Windows的ssh服务,并在Ubuntu的bash中设置ssh自动启动:你能否在你的教程中添加以下内容:1)通过“服务”禁用Windows的ssh代理和代理商。2)在Ubuntu上,设置ssh在启动时自动启动:编辑~/.bashrc并添加“sudo service ssh status || sudo service ssh start”(如果未启动,则启动ssh)。 (对我来说,更新update-rc似乎没有起作用) - Leo Ufimtsev
每次关闭bash时,我在ssh客户端中丢失了ssh连接。有什么解决办法吗?另外,重新启动bash并不能恢复ssh服务器 - 我需要在连接到bash后执行sudo service ssh --full-restart才能使ssh再次正常工作。为什么会这样? - Artem Russakovskii
2当你关闭bash窗口时,他们会停止整个Linux子系统... - Saw
1@JonathanHartley 在一个开箱即用的LXSS安装中,服务器设置似乎有些问题。根据这个答案,卸载并重新安装openssh-server实际上是我需要执行的唯一步骤,以使服务器响应。 - Daniel Saner
1Windows有一个用于端口22的防火墙规则,但它是用于Windows SSH版本(SSH代理)或类似的东西。当防火墙启用时,远程计算机的连接失败。没有防火墙时,远程连接可以正常工作。因此,我将Linux SSH放在自定义端口2022上,并为该端口创建了一个入站规则,而不是为应用程序创建规则。在防火墙启用时,它可以正常工作。 - Sergei G
1@SergeiG,你可以禁用默认的SSH规则,然后添加一个自定义规则来使用端口22。这样就可以正常工作,而不需要使用不同的端口。 - Mark Ingram
这对我有用,但还需要允许端口通过Windows防火墙。 - Norman Breau
如果我将端口更改为2222,即使我将其添加到Windows防火墙中,也无法建立连接。 - mFeinstein
我记得几年前刚开始在WSL上使用SSH服务器时读过这篇文章。今天我意识到没有必要卸载和重新安装——在Ubuntu(以及可能所有基于Debian的发行版)上,sudo dpkg-reconfigure openssh-server 真的是生成主机密钥的最佳实践。 - NotTheDr01ds

上面的答案接近了,但我仍然遇到了“连接被127.0.0.1关闭”的问题。
所以我从头开始,并在删除sshd软件包时提供了--purge选项(如下所示),解决了我遇到的这个问题的变种:
user$ sudo apt-get remove --purge openssh-server # First remove sshd with --purge option.
user$ sudo apt-get install openssh-server
user$ sudo vi /etc/ssh/sshd_config # **See note below.
user$ sudo service ssh --full-restart

# ** Change Port from 22 to 2222. (Just in case MS-Windows is using port 22).
#    Alternatively, you can disable MS-Windows' native SSH service if you 
#    wish to use port 22.

2为什么要给我点踩?这些指示单独使用在我的情况下没有起作用,正如我所提到的,而上面的额外步骤却有效。我真不明白。 - NYCeyes
1我遇到了一个非常不同的错误:“没有可用的支持的身份验证方法(服务器发送:公钥)”,而这些步骤解决了它。 - Mike Viens
2由于某种原因,Windows似乎并不欣赏我使用2222端口。它从未显示任何其他正在使用该端口的进程,并且没有端口冲突的证据,但是一旦我更改了端口,它就开始正常工作了。 - forresthopkinsa
1端口2222对我也不起作用,没有其他服务在运行,但是22端口可以工作,这是一个问题,因为我想要有多个SSH连接。 - mFeinstein
2只需要简单地卸载然后安装就对我有效。 - BaiJiFeiLong
1我只完成了前两个步骤(卸载、安装)。在我的情况下,没有必要编辑sshd_config文件或更改端口。 - Wlad
1对我来说,使用--purge标志移除openssh-server是关键。这样才能使它正常工作。 - sagunms

由于Windows实现不提供chroot,您需要修改/etc/ssh/sshd_config文件。
UsePrivilegeSeparation no

还有,您需要使用useradd命令或类似的方式创建一个用户。

4这一步对于让它正常工作来说是必不可少的。 - Mick
1我很好奇,所以我在https://www.freebsd.org/cgi/man.cgi?sshd_config(5)找到了这个:UsePrivilegeSeparation: - krs013
指定sshd(8)是否通过创建一个非特权子进程来处理传入的网络流量来分离权限。成功认证后,将创建另一个具有已认证用户特权的进程。权限分离的目标是通过将任何损坏限制在非特权进程内部来防止特权升级。参数必须为"yes"、"no"或"sandbox"。如果UsePrivilegeSeparation设置为"sandbox",则预认证的非特权进程将受到额外的限制。默认值为"sandbox"。 - krs013
7WSL在2016年9月实现了chroot功能(此回答之后)。 - GreenReaper

我按照Azazel大师的建议做了一切,但问题依然存在。当我连接到端口22时,被要求输入密码,但我在Linux子系统中设置的密码无效。 解决方案1:/etc/ssh/sshd_config中更改SSH端口,并重新启动子系统中的SSH服务器。 解决方案2: 在Windows的服务控制面板中禁用/停止"SSH Server Broker Services",然后重新启动子系统中的SSH服务器。

1只有在端口22上运行Windows的情况下,才适用于此。 - Master Azazel
3当然,正如你在我默认安装的Win10上所看到的,有一个在22端口运行的服务。 - scotty86

你无法通过ssh连接它的原因在服务器的日志中显示:
chroot("/var/run/sshd"): Function not implemented [preauth]
Linux子系统似乎没有实现chroot,而ssh服务器需要它,所以连接被拒绝。

4哪个是正确的..但其他答案解释了如何绕过chroot要求。 - Mahmoud Al-Qudsi