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
|
配置完成后,通过如下命令直接登录
Reference