最新的 Windows 版本包括基于 OpenSSH 的内置 SSH 服务器和客户端。这意味着现在您可以使用任何 SSH 客户端远程连接到 Windows 10/11 或 Windows Server 2022/2019 计算机,类似于 Linux 发行版。在本文中,我们将向您展示如何在 Windows 10 和 Windows 11 上配置 OpenSSH,并使用 Putty 或任何其他 SSH 客户端连接到它。
OpenSSH 是 Linux 用户长期使用的 Secure Shell (SSH) 的开源跨平台版本。该项目目前已移植到Windows,几乎可以在任何版本的Windows上用作SSH服务器。
如何在 Windows 10 或 11 上安装 SSH 服务器从 Windows 10 build 1809 开始,OpenSSH Server 包含在所有 Windows 操作系统映像中。
您可以通过图形设置面板在 Windows 10 或 11 中启用 OpenSSH 服务器:
转到“设置”>“应用程序”>“应用程序和功能”>“可选功能”(或运行命令 ms-settings:appsfeatures);
单击“添加功能”,选择“OpenSSH 服务器”(基于 OpenSSH 的安全外壳 (SSH) 服务器,用于安全密钥管理和从远程计算机进行访问),然后单击“安装”。
等待 OpenSSH 服务器安装完成。
您还可以使用 PowerShell 安装 sshd 服务器:
Add-WindowsCapability -Online -Name OpenSSH.Server*
或者使用 DISM:
dism /Online /Add-Capability /CapabilityName:OpenSSH.Server~~~~0.0.1.0
如果要确保已安装 OpenSSH 服务器,请运行以下 PS 命令:
Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Server*'
名称:OpenSSH.Server~~~0.0.1.0
状态:已安装
Windows 上的 OpenSSH 服务器作为按需功能 (FoD) 提供。这意味着 Windows 不会在本地存储 OpenSSH 安装的二进制文件。在安装可选功能期间,Windows 会从 Microsoft 更新服务器下载功能文件。如果您的计算机位于离线环境(未连接到 Internet),您可以从离线 FoD ISO 映像安装 OpenSSH Server:
您可以从批量许可服务中心 (VLSC) 或 My Visual Studio 下载适用于您的 Windows 版本的 FoD ISO 映像。
将 FoD ISO 介质安装到 Windows 中的虚拟 DVD 驱动器;
使用以下命令安装 OpenSSH.Server:
Add-WindowsCapability -online -name OpenSSH.Server~~~~0.0.1.0 -source -Source "E:" -LimitAccess
使用以下 PowerShell 命令卸载 SSH 服务器:
Remove-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
笔记。在早期版本的 Windows 上(Windows 10 1809 之前的版本),您可以从 GitHub 存储库手动安装适用于 Windows 的 Win32-OpenSSH 端口。
OpenSSH 二进制文件位于 C:WindowsSystem32OpenSSH 文件夹中。
此路径也添加到 Windows 中的 Path 环境变量中:
$Env:Path
如何在 Windows 上启用和配置 SSH 服务器使用 PowerShell Get-Service 命令检查 ssh-agent 和 sshd 服务的状态:
Get-Service -Name *ssh*
默认情况下,这两个服务都会停止并且不会添加到自动启动中。运行以下命令启动OpenSSH服务并为其配置自动启动:
Start-Service sshd Set-Service -Name sshd -StartupType 'Automatic' Start-Service ssh-agent Set-Service -Name ssh-agent -StartupType 'Automatic'
检查 sshd 服务是否正在运行并侦听端口 TCP/22:
netstat -nao | find /i '":22"'
安装 OpenSSH Server 时,允许远程连接到 SSH 服务器的规则将添加到 Windows Defender 防火墙(描述为 OpenSSH SSH Server (sshd) 的入站规则)。使用 PowerShell 命令检查 OpenSSH 服务器的规则是否已启用:
Get-NetFirewallRule -Name *OpenSSH-Server* |select Name, DisplayName, Description, Enabled
如果规则被禁用,您必须启用它:
Get-NetFirewallRule -Name *OpenSSH-Server*|Enable-NetFirewallRule
您可以使用 %programdata%sshsshd_config 配置文件为 Windows 中的 OpenSSH 服务器配置许多设置。
例如,您可以通过在 sshd_config 文件中启用以下指令来禁用 SSH 密码身份验证并仅保留基于密钥的身份验证:
PubkeyAuthentication yes PasswordAuthentication no
您还可以在此处指定 SSHD 将接受连接的新 TCP 端口(而不是默认的 TCP 22 端口)。例如:
Port 2222
使用指令AllowGroups、AllowUsers、DenyGroups、DenyUsers,您可以指定允许或拒绝通过SSH 连接到Windows 的用户和组:
DenyUsers theitbrosjbrown@192.168.1.15 — 拒绝从 192.168.1.15 主机连接到用户名 jbrown;
DenyUsers theitbros* — 阻止 theitbros 域中的所有用户通过 SSH 连接主机;
允许组 theitbrosssh_allow — 仅允许来自 theitbrosssh_allow 的用户连接主机。
sshd 的允许和拒绝规则按以下顺序处理:DenyUsers、AllowUsers、DenyGroups 和AllowGroups。
例如,要允许主机 192.168.31.100 在 mylocaluser1 帐户下进行 SSH 连接,请添加以下指令
AllowUsers mylocaluser1@192.168.31.100
更改 sshd_config 文件后,需要重新启动 sshd 服务:
Get-Service sshd| Restart-Service –force
通过 SSH 连接到 Windows现在您可以使用任何 SSH 客户端连接到 Windows 计算机。要从 Linux 进行连接,请使用以下命令:
ssh -p 22 admin@192.168.1.90
admin 是您要连接的本地 Windows 用户。此帐户必须是内置管理员组的成员。
192.168.1.90 是远程 Windows 主机的 IP 地址或 FQDN。
之后,Windows 命令提示符窗口将在 SSH 会话中打开。
您可以使用流行的 Putty 客户端通过 SSH 连接到 Windows 计算机:
下载并运行putty.exe;
输入要通过 SSH 连接的远程 Windows 主机的主机名或 IP 地址;
选择连接类型:SSH并确保指定端口22;
点击打开;
第一次通过 SSH 连接到 Windows 主机时,将出现安全警报,要求您确认是否要将远程计算机的 ssh-ed25519 密钥指纹添加到本地缓存。如果您信任该主机,请单击“接受”按钮。这会将该服务器添加到已知 SSH 主机列表中;
ssh-keygen -lf C:ProgramDatasshssh_host_ed25519_key.pub
OpenSSH 服务器指纹存储在文件 C:ProgramDatasshssh_host_ecdsa_key.pub 中。您可以使用以下命令查看 Windows 主机上当前的 ECDSA 密钥指纹:
将出现 Putty 窗口。此处您需要指定要用于连接的 Windows 用户名和密码;
登录后,远程 Windows 主机的命令提示符将打开;
您现在可以在远程主机上以交互方式运行命令。
您还可以使用内置的 Windows SSH 客户端连接到另一台 Windows 主机。使用以下命令在 Windows 上安装 ssh.exe 客户端:
Add-WindowsCapability -Online -Name OpenSSH.Client*
现在,您可以直接从 Windows 命令提示符连接到远程 SSH 主机。使用以下命令:
ssh root@192.168.13.202
第一次连接时,您还需要将 SSH 服务器的 ECDSA 密钥的指纹添加到已知主机列表中。为此,请输入“是”>“输入”。
输入用户的密码。命令行 C:Windowssystem32conhost.exe 应出现:
现在,您可以使用 OpenSSH.Client 工具(scp.exe、sftp.exe)通过 SSH 协议在主机之间复制文件。以下命令将本地 test1.log 文件复制到远程 Windows SSH 主机:
scp.exe D:PStest1.log root@192.168.13.202:c:temp
如果您更喜欢使用 Windows 终端,您可以向其中添加所需的 SSH 主机配置文件以进行快速连接:
运行 Windows 终端并转到其“设置”;
单击“配置文件”部分中的“添加新配置文件”按钮;
指定您要创建 Windows PowerShell 配置文件的副本;
指定配置文件名称(本例中为“SSH Windows 10 DEVPC”);
在命令行参数中,指定 SSH 主机的连接字符串。例如:%SystemRoot%System32WindowsPowerShellv1.0powershell.exe ssh root@192.168.13.202
保存配置文件;
现在,在 Windows 终端菜单中,您将有一个单独的选项,用于快速 SSH 连接到 Windows 主机。
提示:您可以将 Windows 上的默认 SSH shell 从 cmd.exe 更改为 PowerShell CLI。为此,请在运行 OpenSSH 服务器的主机上运行以下命令:
New-ItemProperty -Path "HKLM:SOFTWAREOpenSSH" -Name DefaultShell -Value "C:WindowsSystem32WindowsPowerShellv1.0powershell.exe" -PropertyType String -Force
从这里,当通过 SSH 连接到 Windows 时,您将立即看到 PowerShell 提示符而不是 cmd.exe。
如果您想使用基于密钥的 ssh 身份验证而不是密码身份验证,则需要在客户端上使用 ssh-keygen 生成密钥。在这种情况下,必须将 id_rsa.pub 文件的内容复制到 Windows 10 中的 c:usersadmin.sshauthorized_keys 文件。
之后,您无需密码即可从 Linux 客户端连接到 Windows 10。使用命令:
ssh -l admin@192.168.1.90
在 Windows 上以前版本的 OpenSSH 中,默认情况下所有 sshd 服务日志都写入文本文件 C:ProgramDatasshlogssshd.log。
在 Windows 11 上,可以使用事件查看器控制台 (eventvwr.msc) 查看 SSH 日志。所有 SSH 事件都可以在单独的部分应用程序和服务日志 > OpenSSH > 操作中找到。
例如,屏幕截图显示了通过 SSH 成功连接到计算机的事件示例。您可以看到 ssh 客户端的 IP 地址(主机名)和用于连接的用户名。
sshd:接受来自 192.168.14.14 的 jbrown 密码。端口 49833 ssh2