立即利用 SSH 和 PowerShell 安全传输文件
曾几何时,您可以使用 PowerShell 远程处理通过 Windows PowerShell 连接到的计算机类型受到限制。由于 PowerShell Remoting 仅支持 WsMan 提供程序,因此您连接到运行 Linux 的计算机的机会为零。不过,早在 2015 年,微软就在 Windows 中引入了对 SSH 的支持,带来了巨大的潜力,并最终允许您同时使用 SSH 和 PowerShell。
在本文中,我们将深入了解如何设置 Windows 的 SSH 客户端以及如何利用 SSH 和 PowerShell 远程处理。
这篇 SSH 和 PowerShell 帖子是 #PS7Now 博客系列的一部分。请务必在本文底部查看本系列中的所有其他贡献者。
在你开始之前
本文将是一个演练教程。如果您打算继续操作,请确保满足以下先决条件:
- Windows 10 - 所有示例都将使用 Windows 10 Build 1903。该示例将与远程 Windows Server 位于同一域中。
- Windows 10 上安装的 PowerShell v6+ - 所有示例都将使用 PowerShell 7 RC2。
- 远程 SSH 服务器 - 所有示例都将使用 Windows Server SSH 计算机。如果您要连接到 Linux 计算机,则可以跳过服务器设置步骤。
- TCP 端口 22 在远程服务器上可用
SSH 客户端 (Windows 10) 设置
在打开 PowerShell 控制台之前,您首先需要执行一些一次性任务,以使 SSH 和 PowerShell 协同工作,以确保 Windows 10 可以连接到远程 SSH 服务器。
将 OpenSSH 文件夹添加到 PATH 环境变量
OpenSSH 预装在 Windows 10 上,但有时需要一些帮助才能使用 PowerShell 远程处理。例如,如果您已尝试使用 Enter-PSSession 连接到远程 SSH 系统并遇到以下错误,则需要确保 OpenSSH 可执行文件的路径( ssh.exe)位于 PATH 环境变量中。
Enter-PSSession : An error has occurred which PowerShell cannot handle. A remote session might have ended.要将 OpenSSH 文件夹路径添加到 PATH 环境变量,请单击开始按钮并搜索高级系统设置,然后单击查看高级系统设置 > 如下图。
当系统属性窗口出现时,单击环境变量按钮。
在环境变量窗口中的系统变量下,选择路径,然后单击编辑。
在编辑环境变量窗口中,单击新建,然后输入ssh.exe可执行文件所在的路径。对于本教程,路径为C:\Program Files\OpenSSH,如下所示。输入后,单击确定两次以保存新值。
指定 SSH 子系统
现在,您需要指定在远程 Windows Server 上通过 SSH 连接时要调用的 PowerShell 的 SSH 子系统。如果您不告诉 PowerShell 使用哪个子系统,您将不可避免地收到以下错误:
Enter-PSSession:后台进程报告错误,并显示以下消息:SSH 客户端会话已结束,并显示错误消息:子系统请求在通道 0 上失败。
请注意,如果您没有连接到 Windows Server 计算机,则无需执行这些步骤。
在远程 Windows Server 上,打开 C:\ProgramData\ssh\ssh_config 文件。向下滚动到 ssh_config 文件的覆盖无子系统的默认值部分。该部分将类似于下面的屏幕截图。
在现有 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”接受。
然后系统会提示您输入当前登录用户的密码。
请注意,在此示例中,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 | 清理打开的会话。删除-PSSession!
概括
您现在应该知道如何将 Windows 10 和 Windows Server 设置为将 SSH 与 PowerShell 远程处理结合使用。配置完成后,使用 WsMan 作为传输协议和 SSH 之间的唯一区别是几个参数!
如果您想了解有关 PowerShell 和 SSH 的更多信息,请务必查看 Microsoft 文档文章《PowerShell Remoting over SSH》。
#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// |







