WSL2 作为 Windows 下最触手可及的 Linux 环境,各方面都比虚拟机方便。特别是在 WSLg 加持下,已经有彻底超越 VM 的图形性能。但是 WSL2 有个硬伤:缺少 systemd,导致无法便捷地运行 sshd 这类后台服务。

如果想要远程 SSH 连入自己的 WSL2 distro,那么就要费点脑筋了。通常有两种方法:

1. 使用 Linux 原生运行 OpenSSH Daemon (sshd)

这是不能再直观的一种方案了。既然 WSL2 默认没有运行 sshd,那我们就手动运行它。

How to SSH into WSL2 on Windows 10 from an external machine

个人非常不推荐这种办法,原因:

这两个问题对于无人值守的电脑实在很致命。尽管可以用 https://github.com/arkane-systems/genie 等方法解决,但那又是另外一个麻烦的步骤了。

2. 使用 Windows 自带的 OpenSSH Server

<aside> 🤔 tl;dr 在 HKEY_LOCAL_MACHINE\\SOFTWARE\\OpenSSH 下新增两个注册表项

  1. 名称 DefaultShell,值为字符串 C:\\WINDOWS\\System32\\wsl.exe
  2. 名称 DefaultShellCommandOption,值为字符串 -- 用管理员权限编辑 C:\\ProgramData\\ssh\\sshd_config,修改 Subsystem sftp sftp-server.exeSubsystem sftp /usr/lib/openssh/sftp-server

</aside>

SSH 和 Shell 是两个独立的概念,Windows 目前已经自带了 OpenSSH Server,只不过默认是用 cmd 作为 shell。那么有没有可能用 WSL2 的 bash.exe 作为 shell 呢?确实是可行的:

THE EASY WAY how to SSH into Bash and WSL2 on Windows 10 from an external machine

如此一来,我们也无需在 Linux 内运行 sshd。即使电脑重启,WSL2 尚未启动,因为 Windows 的 OpenSSH Server 服务可以开机自启,我们依然可以远程 SSH 接入并自动唤醒 WSL2。

ZSH?

只不过上面这篇文章没有讲一个关键问题:**如果我用 zsh 而不是 bash 呢?**搜索一番资料后没有找到现成答案。

很可惜,微软只在 Windows 上提供了 bash.exe 而没有 zsh.exe。即便你已经把 zsh 在 WSL2 内设置为了默认 shell,通过 bash.exe 依然会启动到 bash。我实在是不想手动敲入一次 zsh。

不过还记得 wsl.exe 吗?通过 wsl.exe 可以直接启动到默认 distro 的默认 shell。于是我尝试把上文提到的 DefaultShell 这个注册表项改为 C:\\WINDOWS\\System32\\wsl.exe 。尝试 SSH 远程进来,voilà! 真的可以!

But! 我发现虽然 ssh <username>@<windows ip> 可以成功,ssh <username>@<windows ip> <some-command> 这种用法却会报错(VSCode 的 Remote - SSH 扩展正是依赖后者连接远端并执行命令):

Untitled