在 WSL 系统中启用 SSH

vic*_*ico 19 ssh windows-subsystem-for-linux

我正在尝试在 WSL2 系统中运行的 Ubuntu 中启用 SSH:

sudo systemctl status ssh
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
Run Code Online (Sandbox Code Playgroud)

这是什么意思以及如何启用 ssh?

Not*_*1ds 19

更新说明#1WSL2 现在支持 Systemd。有关如何启用它的详细信息,请参阅此答案。启用 Systemd 后,SSH 服务器现在可以自动启动sudo systemctl enable ssh并使用 进行查询sudo systemctl status ssh

尝试在 WSL2 上使用 SSH 时需要注意以下几点:

  • 正如其他人提到的,由于 WSL 尚不支持systemdinit 系统和基础设施,因此您需要依赖其他方法。Ubuntu 的 WSL 版本仍然init.d为大多数服务提供旧式脚本。所以sudo service ssh start(or restart、 or status、 orstop等​​) 就是您将使用的。

然而,除了启用 SSH 之外,您可能还希望能够从远程系统连接到它。WSL2 在具有经过 NAT 的虚拟网络接口的 VM 中运行,因此您将无法ssh从网络上的任何其他计算机访问 WSL 实例,而无需付出额外的努力。不过, WSL确实提供自动本地主机转发,因此您可以ssh从同一台计算机上的 Windows 或同一台计算机上的另一个 WSL 实例进行访问。


更新说明 #2: 以下方法不再适用于从 Microsoft Store 安装的最新 WSL 版本。WSL 的应用商店版本有一个已知限制,不允许从远程 SSH 会话启动它。现在将答案留在这里,但我很快就会用不同的(不幸的是,不太理想的解决方案)更新它。

如果您只需要从远程计算机终端访问 WSL,那么这里有一个更简单的解决方案:

  • 在Windows中安装 OpenSSH 服务器(说明)。
  • 使用 远程访问您的 WSL 实例ssh -t windows_user@windows_host wsl。它只是连接到 Windows 主机,使用 分配一个伪终端-t,并wsl使用该伪终端运行命令。

另一方面,如果您需要对 WSL 实例进行真正的SSH 访问,那么“通常的答案”仍然相当复杂。请参阅此 Github 评论和线程以及我对端口转发的常规选项的总结

但这是“一般情况”。因为ssh我们可以通过在 Windows 主机WSL 实例中使用 ssh 服务器来使其变得更容易。请参阅我的答案中的“简短版本”,如果您在此答案中需要它们,请参阅(远)更多详细信息。

“更多详细信息”答案还包括远程启动 ssh 服务器的解决方案,因为它不会在 WSL 下启动时自动运行。

  • 这可能最近发生了变化?我刚刚在 Windows 10 上安装了 Debian WSL,运行了“sudo apt-get install openssh-server”和“sudo service ssh start”。Windows 防火墙对话框提示我允许访问端口,我立即能够从远程计算机进行 ssh。它也已经在重新启动时启用! (5认同)

mat*_*igo 7

对于 WSL,您需要使用正确的语法:

\n
sudo service ssh status\n
Run Code Online (Sandbox Code Playgroud)\n

这将为您提供您正在寻找的内容:

\n
\xe2\x97\x8f ssh.service - OpenBSD Secure Shell server\n     Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)\n     Active: active (running) since Sat 2021-05-22 19:54:00 JST; 3h 25min ago\n       Docs: man:sshd(8)\n             man:sshd_config(5)\n    Process: 2129 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)\n   Main PID: 2137 (sshd)\n      Tasks: 1 (limit: 9127)\n     Memory: 1.8M\n     CGroup: /system.slice/ssh.service\n             \xe2\x94\x94\xe2\x94\x802137 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups\n\n 5\xe6\x9c\x88 22 19:54:00 Carbon systemd[1]: Starting OpenBSD Secure Shell server...\n 5\xe6\x9c\x88 22 19:54:00 Carbon sshd[2137]: Server listening on 0.0.0.0 port 22.\n 5\xe6\x9c\x88 22 19:54:00 Carbon sshd[2137]: Server listening on :: port 22.\n 5\xe6\x9c\x88 22 19:54:00 Carbon systemd[1]: Started OpenBSD Secure Shell server.\n
Run Code Online (Sandbox Code Playgroud)\n

  • 虽然您引用的命令是正确的,但输出并不是您在 WSL 上收到的输出。在 WSL 上,“service ssh status”使用旧的“init.d”样式脚本,因此您只会看到“* sshd is running”或“sshd is not running”作为命令的输出。 (5认同)