WSL2 作为 Windows 下最触手可及的 Linux 环境,各方面都比虚拟机方便。特别是在 WSLg 加持下,已经有彻底超越 VM 的图形性能。但是 WSL2 有个硬伤:缺少 systemd
,导致无法便捷地运行 sshd
这类后台服务。
如果想要远程 SSH 连入自己的 WSL2 distro,那么就要费点脑筋了。通常有两种方法:
这是不能再直观的一种方案了。既然 WSL2 默认没有运行 sshd,那我们就手动运行它。
How to SSH into WSL2 on Windows 10 from an external machine
个人非常不推荐这种办法,原因:
这两个问题对于无人值守的电脑实在很致命。尽管可以用 https://github.com/arkane-systems/genie 等方法解决,但那又是另外一个麻烦的步骤了。
<aside>
🤔 tl;dr 在 HKEY_LOCAL_MACHINE\\SOFTWARE\\OpenSSH
下新增两个注册表项
DefaultShell
,值为字符串 C:\\WINDOWS\\System32\\wsl.exe
DefaultShellCommandOption
,值为字符串 --
用管理员权限编辑 C:\\ProgramData\\ssh\\sshd_config
,修改 Subsystem sftp sftp-server.exe
为 Subsystem 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 而不是 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 扩展正是依赖后者连接远端并执行命令):