Mac 通过 ssh 连接 Windows WSL(局域网)

问题

逐渐发现 windows 是游戏机的本质,linux 才是正确选择。决定以后代码开发全在 mac 或者 WSL 上进行,那么只要搞定 mac 连接 windows WSL,就可以实现只用mac 开发了。

实现

mac 通过 ssh 直接连接 windows 的cmd 是很简单的,然后可以直接从 Windows 的 cmd 进入到 wsl。 但是这样有一个问题就是 像 vscode 的 remote-ssh 插件之类的无法打开 wsl 的文件夹,也就无法作为文件管理器 来便利的进行 代码编写。

这里我们采用 端口转发的方式,我们可以通过 2222 端口连接到 win,然后 win 会自动 将 2222 端口映射 到 wsl 的22 端口上,具体实现步骤如下:

  1. win 的 wsl 上下载 openssh-server

    1
    2
    3
    4
    5
    # win 登入 wsl
    sudo apt install openssh-server

    # 如果启动遇到这个错误 sshd: no hostkeys available -- exiting
    # 执行 sudo ssh-keygen -A
  2. 启动 sshd 服务 并 设置开机自启

    1
    2
    sudo systemctl start ssh
    sudo systemctl enable ssh
  3. windows端 设置转发

    (WSL不要关闭了)我们要设置将 win 的2222 端口转发到 wsl 的 22 端口。但是 wsl 的 ip 地址不固定,所以写一个脚本来抓取。

    新建一个 sshd.bat 文件,写入以下代码,文件随便放在什么地方。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    @echo off
    setlocal

    echo Starting WSL SSH service...
    wsl.exe -u root service ssh start

    echo Getting precise WSL eth0 IP address...
    :: 使用 grep 抓取 eth0 网卡的 IPv4 地址
    for /f "usebackq" %%i in (`wsl.exe --exec bash -c "ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}'"`) do set WSL_IP=%%i

    if "%WSL_IP%"=="" (
    echo [ERROR] Failed to get WSL IP.
    pause
    goto :eof
    )

    echo Clearing old proxy rules...
    netsh.exe interface portproxy delete v4tov4 listenport=2222 listenaddress=0.0.0.0 protocol=tcp

    echo Setting up new proxy: Windows:2222 -^> WSL:22 (%WSL_IP%) ...
    netsh.exe interface portproxy add v4tov4 listenport=2222 listenaddress=0.0.0.0 connectport=22 connectaddress=%WSL_IP%

    echo.
    echo ==============================================
    echo Success! Port Proxy is Active.
    echo WSL Internal IP : %WSL_IP% (Port 22)
    echo Windows Proxy : 0.0.0.0 (Port 2222)
    echo ==============================================

    endlocal
  4. 防火墙放行 2222 端口,因为我们本质是要从其他电脑上访问 2222 端口

    1
    2
    3
    进入防火墙和安全保护  ->  高级设置 ->  入站规则

    新建规则 -> 选择端口 -> TCP、特定本地端口输入 2222 -> 允许连接 -> 域、专用 -> 名称设置为 wsl_2222 (自定义)

​ 点击完成即可。这里出于 一丢丢的安全考虑,没有选择公用。
​ 我们局域网工作情况下也一般不会使用公用网络,记得将自己的 wifi 或者热点设置为专用网络。

  1. windows 端测试

    注意全程 wsl 不要关闭了,关闭了的话 无法连接。

    我们新开一个终端来进行转发测试

    1
    ssh -p 2222 wsl_user_name@localhost

    这里的 wsl_user_name 就是你的 wsl 的用户名。如果要输入密码的话 就是 wsl 的用户密码。

    不记得密码的话我们直接用root 权限改

    1
    sudo passwd wsl_user_name

​ 如果可以直接连接到 wsl,就说明我们的端口转发成功了。

  1. 其他电脑测试

    1
    ssh -p 2222 wsl_user_name@windows_ip

    这里的 windows_ip 在 windows上 点击 wifi 找到所连接的wifi ,查看信息可以找到 IPv4 地址。

    直接 cmd 使用 ifconfig 找到无线局域网 WLAN 的 IPv4 地址 也行

  2. 其他配置

    不出意外的话到这里就大功告成了,之后还可以进行免密配置等一系列操作

    首先可以在 .ssh 目录下的 config 设置 服务器别名,这里我是 mac 路径,为 /Users/xinfei/.ssh

    可以仿造如下进行填写,把 HostName 改成 win_ip,User 改成 wsl user name (如果这里你的 win_ip 总是变得花也可以写脚本自动拉取,这里就不展开了,直接AI吧)

    1
    2
    3
    4
    Host win_wsl
    HostName 192.168.203.250
    port 2222
    User feixin

    这样之后就可以直接 ssh win_wsl 进行登陆

​ 免密配置:

​ 在mac (其他电脑)上使用以下命令登陆一次

    
1
ssh-copy-id win_wsl

​ 再输入一次密码,即可解锁免密登陆。