分类
wsl

WSL2 使用 ssh-server 笔记

升级到 WSL2 之后,我面临几个问题:

  • webpack-dev-server 无法监控 /mnt/c/xxxx 这样的路径下的文件变化,使得 HMR 失效。只能借由 ~/path/to/project/ 启动开发环境。
  • 启动服务后,无法通过 127.0.0.1:port/ 访问,只能通过 localhost:port 访问。

今天想使用 ssh-server 连上去,结果失败,经查,原来 WSL2 的底层逻辑变了:

If this is WSL2 (which it appears to be) this is for all intents by-design. WSL2 has its own Real Linux™ network stack inside a VM, and a virtual Ethernet device. Contrast WSL1 which took the approach of attempting to present the Windows network stack inside Linux.

WSL2 就是这么设计的。它在虚拟机里有自己真实的 Linux 网络栈,以及虚拟的以太网设备。

WSL2: ifconfig not showing all network connections · Issue #4915 · microsoft/WSL (github.com)

所以要用不同的方式来做,记录在这篇笔记里。

方案一:使用 ssh-server

1. 在 Windows 里安装 ssh-server

  1. 设置 > 应用 > 应用和功能 > 可选功能 > 添加功能
  2. 搜索并安装 ssh-sever
  3. 启动 ssh-server,需使用管理员身份启动 powershell
# 启动 ssh 服务
Start-Service sshd

# 可选,设置 sshd 为开机自动启动
Set-Service -Name sshd -StartupType 'Automatic'

# 往防火墙里添加规则
if (!(Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue | Select-Object Name, Enabled)) {
    Write-Output "Firewall Rule 'OpenSSH-Server-In-TCP' does not exist, creating it..."
    New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
} else {
    Write-Output "Firewall rule 'OpenSSH-Server-In-TCP' has been created and exists."
}

2. ssh 连接

在另外一台机器上输入 ssh username@ip-or-host 即可完成连接。

不过需要注意的是,比如我的账户名为 Meathill Zhai,这个名称不能直接使用。我的邮箱是 realmeathill[at]hotmail.com,系统会自动截取一段,我在命令行里的初始位置是:C:\Users\realm,于是登录的时候只能用 ssh realm@ip,然后输入 realmeathill[at]hotmail.com 的密码,方能完成登录。

3. 改为连接 WSL2

默认情况下,使用 ssh 连入的命令行是 cmd.exe,可以通过以下命令修改为 Powershell:

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -PropertyType String -Force

如果把里面的 WindowsPowerShell\v1.0\powershell.exe 修改为 bash.exe,那么就会连入 WSL2 了。

4. 改回 powershell

直接连入WSL2 也不是不行,不过这样的话,一些涉及 Windows 系统的操作无法进行,exit 也是直接退出 ssh 连接。于是我觉得默认连入 powershell 比较好,想用 WSL 就手动 bash 进入 WSL 即可。

待解决问题

  • powershell ssh-server 不支持 authorized_keys 登录

参考文章

分类
npm

解决新机不能 npm install 私有仓库的问题

前些天换了电脑,从 iMac 27 Retina 2014 late 升级到 iMac 27 2019。关于前因后果,我写在张大妈,感兴趣的同学可以看下:《肉山的电子产品 篇九:机不如新,人不如故——iMac 27 换新记》

换机器要搭环境。有两个选择:

  1. 整盘复制,利用 Time Machine 之类的工具
  2. 自己慢慢搭

考虑到老电脑已经工作了 5 年,经历了小十个系统版本,各种软件删装无数,里面的垃圾很多;再加上我的环境并不复杂,所以我决定自己慢慢搭。

然后遇到一个问题:npm install 会卡住,没有明显的提示信息,只有一段比较可疑:

The authenticity of host 'GitHub.com (1.1.1.1)' can't be established.
ECDSA key fingerprint is SHA256:abcdefg.
Are you sure you want to continue connecting (yes/no)? 

因为项目中用到一些私有仓库的依赖,所以我怀疑是它们的问题。于是我把私有仓库从 package.json 里移除,再安装,成功。看来猜的没错。

然后我手动 git clone 一个项目到本地,clone 的过程中,会看到上面的提示,手动输入 yes,记录目标机器的指纹,视它安全可靠。clone 完成。再把私有仓库依赖加回 package.json,安装,成功。问题解决。

原因:使用 npm 安装 GitHub 仓库作为依赖,实际上等同于使用 git clone 将目标仓库 clone 到 node_modules 里。而 git 协议依托于 ssh 协议。在新机器上安装时,因为没有访问过目标机器,本地不信任目标机器,而 npm 又没有对这个异常做处理,所以就会卡住,不上不下。