从前,使用Windows PowerShell进行连接的计算机种类受限,只能使用PowerShell远程。由于PowerShell远程仅支持WsMan提供程序,例如,连接运行Linux的计算机的机会几乎为零。然而,早在2015年,微软引入了对SSH的支持,为Windows带来了巨大的潜力,最终使您能够同时使用SSH和PowerShell。
在本文中,我们将深入探讨如何设置Windows的SSH客户端,以及如何利用SSH和PowerShell远程。
此SSH和PowerShell文章是#PS7Now博客系列的一部分。确保查看本文底部的所有其他贡献者。
开始之前
本文将是一个逐步教程。如果您打算跟着操作,请确保满足以下先决条件:
- Windows 10 – 所有示例将使用 Windows 10 Build 1903。示例将位于与远程 Windows 服务器相同的域中。
- Windows 10 上安装 PowerShell v6+ – 所有示例将使用 PowerShell 7 RC2。
- A remote SSH server – All examples will use a Windows Server SSH machine. If you’re connecting to a Linux machine, you can skip the server setup steps.
- 远程服务器上可用的 TCP 端口 22
SSH 客户端(Windows 10)设置
在打开 PowerShell 控制台之前,您首先需要执行一些一次性任务,以确保 SSH 和 PowerShell 协同工作,以确保 Windows 10 可以连接到远程 SSH 服务器。
将 OpenSSH 文件夹添加到 PATH 环境变量
OpenSSH 预先安装在 Windows 10 上,但有时需要一些帮助才能与 PowerShell 远程工作。例如,如果您已经尝试使用 Enter-PSSession
连接到远程 SSH 系统,并遇到下面的错误,则需要确保 PATH 环境变量中的 OpenSSH 可执行文件 (ssh.exe) 的路径。
要将OpenSSH文件夹路径添加到PATH环境变量中,请点击 开始 按钮,搜索 高级系统设置,然后点击如下所示的 查看高级系统设置。

当出现 系统属性 窗口时,点击 环境变量 按钮。

在 环境变量 窗口中,在 系统变量 下,选择 Path 并点击 编辑。

在 编辑环境变量 窗口中,点击 新建 然后输入 ssh.exe 可执行文件所在的路径。对于本教程,路径为 C:\Program Files\OpenSSH 如下所示。输入后,点击两次 确定 以保存新值。

指定SSH子系统
现在您需要指定SSH子系统,以便PowerShell在通过SSH连接到远程Windows服务器时调用。如果不告诉PowerShell要使用哪个子系统,您最终将收到以下错误:
Enter-PSSession:后台进程报告了以下错误消息:SSH客户端会话以错误消息终止:通道0上的子系统请求失败。
请注意,如果您不连接到Windows服务器机器,则无需执行这些步骤。
在远程 Windows 服务器上,打开 C:\ProgramData\ssh\ssh_config 文件。滚动到 override default of no subsystems 部分的 ssh_config 文件。该部分将如下截图所示。

在现有的 Subsystem 行下面,添加 PowerShell 子系统,使用下面的行:
现在保存 ssh_config 文件,并在远程 Windows 服务器上重新启动 sshd Windows 服务,如下所示。
一旦服务重新启动,现在您应该能够通过 SSH 和 PowerShell 进行连接。
通过 PowerShell 和 SSH 进行连接
现在配置已完成,是时候测试 PowerShell Remoting 了。
首先,尝试使用 Enter-PSSession
cmdlet 进入交互式会话。与您可能习惯的方式不同,您不会使用 ComputerName
参数。相反,您将使用 HostName
参数指定远程计算机。
默认情况下,PowerShell Remoting 仍然使用 WsMan。要覆盖默认设置,请使用 SSHTransport
参数指示您希望通过 SSH 和 PowerShell 进行连接。
当您首次尝试使用用户名和密码连接时,您需要创建一个 SSH 私钥。要执行此操作,您将如下提示。当提示时,输入 ‘y’ 以接受。

然后,您将被提示输入当前登录用户的密码。
请注意,此示例中的Windows 10客户端和Windows Server SSH服务器位于同一个Active Directory域中。默认情况下,PowerShell Remoting将尝试使用登录用户进行身份验证。您还可以使用
Credential
参数指定不同的用户名和密码。
提供密码后,您应该会看到熟悉的PowerShell Remoting提示符。

现在退出会话使用exit
,然后尝试使用New-PSSession
。注意下面使用与之前相同的HostName
和SSHTransport
参数,现在Transport
显示为SSH
。
您仍然可以使用ComputerName
参数来使用WsMan作为传输协议,而无需使用SSHTransport
参数。
对于SSH,您不必使用用户名和密码。您可以使用私钥文件并使用
KeyFilePath
参数提供位置。

不要忘记使用Get-PSSession | Remove-PSSession
清理打开的会话!
摘要
您现在应该知道如何设置Windows 10和Windows Server以使用PowerShell Remoting进行SSH。一旦配置完成,使用WsMan作为传输协议和SSH之间的唯一区别是几个参数!
如果您想了解更多关于PowerShell和SSH的信息,请务必查看微软文档中关于通过SSH进行PowerShell远程控制的文章。
#PS7Now贡献者
此帖子是关于PowerShell 7系列的一部分,由下面优秀的贡献者撰写。请务必查看他们的帖子,了解他们在博客上的动态!
Author | Blog | |
---|---|---|
Josh King | @WindosNZ | https://toastit.dev/ |
Adam Bertram | @adbertram | https://adamtheautomator.com/ |
Jonathan Medd | @jonathanmedd | |
Thomas Lee | @doctordns | https://tfl09.blogspot.com/ |
Prateek Singh | @singhprateik | https://ridicurious.com |
Dave Carroll | @thedavecarroll | https://powershell.anovelidea.org/ |
Dan Franciscus | @dan_franciscus | https://winsysblog.com/ |
Jeff Hicks | @jeffhicks | https://jdhitsolutions.com |
Josh Duffney | @joshduffney | http://duffney.io/ |
Mike Kanakos | @MikeKanakos | https://www.networkadm.in/ |
Tommy Maynard | @thetommymaynard | https://tommymaynard.com// |