【记录】SSH 远程登录 Windows 和 WSL

SSH 登录 Windows

通过 SSH 远程连接 Windows,先检查 OpenSSH 的服务状态(以管理员身份)。

1
2
3
4
5
6
7
PS > Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'
---
Name  : OpenSSH.Client~~~~0.0.1.0
State : Installed

Name  : OpenSSH.Server~~~~0.0.1.0
State : NotPresent

增加 OpenSSH.Server 服务

1
PS > Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

启动并查看 SSH 服务状态

1
2
PS > Start-Service sshd
PS > Get-Service sshd

设置开机自动启动

1
PS > Set-Service -Name sshd -StartupType 'Automatic'

设置 PowerShell 为 SSH 登录后的默认 Shell

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

WSL 初步安装

wsl 与 Windows 的关系:

linux on windows: C:\Users\Dell\AppData\Local\Packages\…
windows on linux: /mnt/c

用户设置

1
2
3
4
# 在 Powershell 中直接以特定用户进入 wsl
PS> wsl -u root/uname
# 设置 wsl 默认用户
PS> ubuntu config --default-user root/uname

远程访问 WSL

WSL OpenSSH 配置

使用 ssh 登录 wsl,先在 WSL 中安装 OpenSSH server

1
$ sudo apt install openssh-server

修改 sshd_config 完成 OpenSSH 配置。Port 用于指定 SSH 服务器监听的端口号。SSH 端口默认是 22,但为了与 Window’s 本机的 22 端口区分,故设置一个好记忆的新端口 2222;

ListenAddress 监听地址设为 0.0.0.0(默认值),即在所有可用的网络接口上监听连接请求;

PasswordAuthentication 用于指定是否允许使用密码进行身份验证,默认为yes

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
$ sudo vim /etc/ssh/sshd_config
---
Port 2222
#AddressFamily any
ListenAddress 0.0.0.0
#ListenAddress ::
---

# 重启 OpenSSH 服务器使配置生效
$ sudo /etc/init.d/ssh restart
# $ service ssh start

Windows 端口转发

在 WSL 中用 ifconfig 查看 IP,得到私有网络 IP 地址172.25.101.120(一般均为172.x.x.x)。

 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
$ ifconfig
---
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.25.101.120  netmask 255.255.240.0  broadcast 172.25.111.255
        inet6 fe80::215:5dff:fe37:aba4  prefixlen 64  scopeid 0x20<link>
        ether 00:15:5d:37:ab:a4  txqueuelen 1000  (Ethernet)
        RX packets 89179  bytes 58115580 (58.1 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 58928  bytes 25947810 (25.9 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 71624  bytes 29230006 (29.2 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 71624  bytes 29230006 (29.2 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:d8:d3:70  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

在 PowerShell 中设置端口转发

1
2
3
# 先重置所有端口转发
PS> netsh int portproxy reset all
PS> netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=2222 connectaddress=172.25.101.120 connectport=2222

打开防火墙设置

1
PS> netsh advfirewall firewall add rule name=Open Port 2222 for WSL2 dir=in action=allow protocol=TCP localport=2222

查看设置结果

1
2
3
4
5
6
PS> netsh int portproxy show v4tov4
---
Listen on ipv4:             Connect to ipv4:
Address         Port        Address         Port
--------------- ----------  --------------- ----------
0.0.0.0         2222        172.25.101.120  2222

注意:WSL IP 可能不稳定(实际使用一直未改变),可以通过一个.ps1脚本 完成端口转发配置。相关社区讨论了脚本功能,并已有实现此功能的开源脚本

Client 登录测试

注意 SSH 登录时指定端口为 2222

1
ssh uname@xxx.xxx.xx.xx -p 2222

配置 ssh config

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
vim ~/.ssh/config
---
Host hostname
  HostName xxx.xxx.xx.xx
  User uname
  Port 2222
  TCPKeepAlive=yes
  ServerAliveInterval=15
  ServerAliveCountMax=6
  Compression=yes
  ControlMaster auto
  ControlPath /tmp/%r@%h:%p
  ControlPersist yes
  IdentityFile /Users/uname/.ssh/id_rsa

配置完成后,通过如下命令直接登录

1
ssh uname@hostname

Reference

0%