SSH和PowerShell:设置Windows SSH客户端

从前,使用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) 的路径。

Enter-PSSession : An error has occurred which PowerShell cannot handle. A remote session might have ended.

要将OpenSSH文件夹路径添加到PATH环境变量中,请点击 开始 按钮,搜索 高级系统设置,然后点击如下所示的 查看高级系统设置

Adding OpenSSH folder path

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

Environment Variables in System Properties

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

System Variables in the Environment Variables

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

Editing Environment Variable

指定SSH子系统

现在您需要指定SSH子系统,以便PowerShell在通过SSH连接到远程Windows服务器时调用。如果不告诉PowerShell要使用哪个子系统,您最终将收到以下错误:

Enter-PSSession:后台进程报告了以下错误消息:SSH客户端会话以错误消息终止:通道0上的子系统请求失败。

请注意,如果您不连接到Windows服务器机器,则无需执行这些步骤。

在远程 Windows 服务器上,打开 C:\ProgramData\ssh\ssh_config 文件。滚动到 override default of no subsystems 部分的 ssh_config 文件。该部分将如下截图所示。

Override Default of no Subsystems

在现有的 Subsystem 行下面,添加 PowerShell 子系统,使用下面的行:

Subsystem	powershell pwsh.exe -sshs -NoLogo -NoProfile

现在保存 ssh_config 文件,并在远程 Windows 服务器上重新启动 sshd Windows 服务,如下所示。

Get-Service -Name sshd | Restart-Service

一旦服务重新启动,现在您应该能够通过 SSH 和 PowerShell 进行连接。

通过 PowerShell 和 SSH 进行连接

现在配置已完成,是时候测试 PowerShell Remoting 了。

首先,尝试使用 Enter-PSSession cmdlet 进入交互式会话。与您可能习惯的方式不同,您不会使用 ComputerName 参数。相反,您将使用 HostName 参数指定远程计算机。

默认情况下,PowerShell Remoting 仍然使用 WsMan。要覆盖默认设置,请使用 SSHTransport 参数指示您希望通过 SSH 和 PowerShell 进行连接。

当您首次尝试使用用户名和密码连接时,您需要创建一个 SSH 私钥。要执行此操作,您将如下提示。当提示时,输入 ‘y’ 以接受。

Creating SSH Private Key

然后,您将被提示输入当前登录用户的密码。

请注意,此示例中的Windows 10客户端和Windows Server SSH服务器位于同一个Active Directory域中。默认情况下,PowerShell Remoting将尝试使用登录用户进行身份验证。您还可以使用Credential参数指定不同的用户名和密码。

提供密码后,您应该会看到熟悉的PowerShell Remoting提示符。

Powershell Remoting Prompt

现在退出会话使用exit,然后尝试使用New-PSSession。注意下面使用与之前相同的HostNameSSHTransport参数,现在Transport显示为SSH

您仍然可以使用ComputerName参数来使用WsMan作为传输协议,而无需使用SSHTransport参数。

对于SSH,您不必使用用户名和密码。您可以使用私钥文件并使用KeyFilePath参数提供位置。

New PSSession Showing up SSH

不要忘记使用Get-PSSession | Remove-PSSession清理打开的会话!

摘要

您现在应该知道如何设置Windows 10和Windows Server以使用PowerShell Remoting进行SSH。一旦配置完成,使用WsMan作为传输协议和SSH之间的唯一区别是几个参数!

如果您想了解更多关于PowerShell和SSH的信息,请务必查看微软文档中关于通过SSH进行PowerShell远程控制的文章。

#PS7Now贡献者

此帖子是关于PowerShell 7系列的一部分,由下面优秀的贡献者撰写。请务必查看他们的帖子,了解他们在博客上的动态!

Author Twitter 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//
#PS7Now Contributors

Source:
https://adamtheautomator.com/powershell-ssh/