一项关于 PowerShell 在过去几年如何改变的伟大之处是它正在采用许多与非 Windows 机器交互的方式。其中一个变化是支持通过 SSH 进行 PSRemoting。通过 SSH 进行 PSRemoting 也意味着拥有 PSRemoting Linux!
虽然设置 PSRemoting 以与 SSH 和 Linux 一起工作需要一些设置才能正常工作,但这使您可以使用 PowerShell 与 Linux 机器进行原生交互。
在本教程中,您将学习如何设置 Windows 客户端以使用 PSRemoting over SSH 连接到 Linux 计算机(CentOS),反之亦然。您将学习如何使用密码和证书进行身份验证。
先决条件
本教程将进行逐步讲解。如果您想跟着做,请确保提前具备以下条件:
- A Windows 10 build 1809 or greater machine. The tutorial will use Windows Server 2019 Standard as the remote server.
- A Linux machine that supports PowerShell 7. The tutorial will use CentOS 8.
- Linux 机器上的 Sudo 权限和 Windows 机器上的本地管理员权限。初始设置完成后,部分权限可以被撤销。
设置 Windows(客户端)以通过 SSH 进行 PSRemoting
首先,您需要在 Windows 客户端上配置 PSRemoting 客户端(PowerShell)。为此,您需要设置和配置 PowerShell 7+ 和 OpenSSH。
安装 PowerShell 7+
首先,安装 PowerShell 7+。本教程不涵盖如何执行此操作。要了解如何操作,请查看下面的链接。
安装 OpenSSH
您还需要安装 OpenSSH。OpenSSH 是 PSRemoting 将用于连接到远程 Linux 计算机的包。您可以使用 PowerShell 通过下面示例所示的 `Get-WindowsCapability` 命令安装 OpenSSH。
根据您的 Windows 主机是作为客户端还是服务器的意图,您需要安装哪个 Windows 功能取决于情况。如果您从 Windows Server 连接到 Linux,则只需安装 OpenSSH 客户端。如果您从 Linux 连接到 Windows Server,则只需安装 OpenSSH 服务器。
下面的命令查找所有名称以 `OpenSSH` 开头的 Windows 功能,并安装它们,因此它将同时安装客户端和服务器。
如果您只想安装客户端,请将 `Where-Object` 脚本块中的过滤器更改为 `OpenSSH.Client*`,对于服务器,过滤器应为 `OpenSSH.Server*`。
启动 SSH 服务器
一旦安装了 OpenSSH,它将在端口 22 上打开 Windows 防火墙,但不会启动 OpenSSH 服务器服务以侦听该端口。要在 Windows Server 上启动 OpenSSH 服务器并设置服务在启动时启动,请运行以下 PowerShell 命令。
配置 OpenSSH 配置
下一步是修改sshd_config守护进程配置文件。在这个文件中,您必须首先确认启用了密码身份验证,还要添加PowerShell子系统。
本教程的这一部分是使用密码设置最简单的方法。您将在本教程后面学习如何使用证书设置SSH身份验证。
- 用您喜欢的文本编辑器打开配置文件,路径为C:\ProgramData\ssh\sshd_config。
2.确认密码身份验证是否启用,其中PasswordAuthentication行是否以#
开头被注释掉,或者设置为yes
。

3.添加PowerShell子系统。对于PowerShell 7,添加以下行:Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo
。
- 选项
-sshs
用于允许PowerShell 7作为子系统在SSH中运行。 - 选项
-NoLogo
使PowerShell在启动时隐藏版权信息,确保启动SSH会话时没有意外的输出。
4.保存并关闭配置文件。
5.重新启动sshd Windows服务。您可以通过运行Restart-Service sshd
在PowerShell中执行此操作。
现在,您应该已经配置好了通过SSH连接到这台Windows服务器的所需的一切从(客户端)和到(服务器)使用PSRemoting。
设置Linux(服务器)以通过SSH进行PSRemoting
接下来是具有类似设置的Linux;安装PowerShell并配置OpenSSH。
请注意,由于我们使用的是CentOS,如果您使用不同的发行版,则某些命令可能会有所不同。
安装PowerShell 7+
首先,安装PowerShell 7。本教程将不涵盖如何执行此操作。请确保查看以下链接。
相关: 如何在Windows、macOS和Linux上下载并安装PowerShell 7
配置OpenSSH
像Windows服务器一样,您将需要OpenSSH。不过,与Windows不同,OpenSSH可能已经安装好了。对于运行CentOS 8的本教程,Linux机器默认已经安装了客户端和服务器,但您可以使用以下命令进行检查:
如果已安装客户端和服务器,您应该会得到类似下面的输出。

通过以下方式配置SSH配置文件:
- 通过运行
sudo vi /etc/ssh/sshd_config
打开sshd_config文件。
2. 添加PowerShell子系统,就像在Windows Server上添加以下行到配置文件一样。
3. 退出vi并保存文件。
4. 通过运行sudo systemctl restart sshd
重新启动ssh守护程序以应用更改。
默认情况下,在大多数情况下,包括CentOS 8,将启用密码和公钥身份验证。无需在此添加这些。
连接到/从Windows/Linux使用密码身份验证
一旦您在Linux和Windows机器上都设置好了一切,现在是时候把您所做的工作投入到实际使用中了。现在让我们尝试从Windows连接到Linux,反之亦然,使用密码身份验证。
基于密码的身份验证看起来和感觉都很熟悉,就像使用用户名和密码进行SSH一样。
连接命令
为了测试从Windows到Linux或从Linux到Windows使用PSRemoting over SSH进行连接,让我们使用“即席”会话和使用Invoke-Command
cmdlet以及使用New-PSSession
进行持久会话。
相关:Invoke-Command: 运行远程代码的最佳方式
通过以下步骤测试PSRemoting连接,使用Invoke-Command
:
- 打开您的PowerShell 7控制台。
2. 为Invoke-Command
cmdlet设置参数。在这种情况下,以下参数将连接到一个名为SRV1的计算机,使用SRV1上的一个名为User的本地用户帐户。
3. 通过展开上述参数并在脚本块内运行命令(在本例中是Get-Process
)来运行Invoke-Command
。
相关: PowerShell Splatting: 是什么以及它是如何工作的?
然后,您应该看到SRV1计算机上所有正在运行的进程的列表。
您还可以建立一个持久连接,允许您与之互连并交互式运行命令:
- 提供上述参数并将其传递给
New-PSSession
cmdlet。
2. 通过使用Enter-PSSession
cmdlet 与该会话进行交互连接。
3. 在运行上述Enter-PSSession
命令后,系统将提示您输入用户的密码。经过验证后,您将在 PowerShell 中连接到另一台计算机。
请注意,上述任何命令都不需要常见的Credential
参数来提供用户名和密码进行连接。相反,我们使用了SSHTransport
参数。SSH 不使用与 Windows 从一台 Windows 计算机到另一台计算机转移的相同身份验证过程,因此它无法解释 PSCredential 对象。
相关: 使用 PowerShell Get-Credential
cmdlet 以及有关凭据的所有事宜。
使用这种方法,您还可以利用断开连接的会话。
设置基于公钥的身份验证
虽然基于密码的身份验证设置简单且易于使用,但存在两个问题。
- 没有办法在没有人手动安全运行命令的情况下进行身份验证。
- 您正在通过网络发送密码。
虽然在SSH连接中加密了密码,但服务器以明文形式接收密码。如果服务器以某种方式受到 compromise,这可能成为安全问题。
生成公钥/私钥
在使用任何类型的公钥身份验证时,您必须首先从客户端生成公钥。此要求适用于Linux和Windows。
在Linux或Windows服务器机器上:
- 运行
ssh-keygen
以生成密钥对。
如果您在Linux上运行
ssh-keygen
,请注意它将默认生成RSA密钥对。许多新的Linux操作系统将不允许默认情况下使用RSA密钥对进行身份验证。要更正此错误,请使用ssh-keygen -t ed25519
。
2. 您将被提示提供存储私钥的路径和用于加密私钥的密码。如果您在身份验证期间不想提供密码,可以将密码留空。
3. 仅适用于Windows:从PowerShell运行下面的命令,其中<ProfilePath>
是您配置文件的路径(可能是C:\Users\UserName)。
Windows的OpenSSH实现具有一个ssh-agent服务,允许您将私钥存储在您登录的用户的Windows安全上下文中。这将使您能够将SSH私钥导入到ssh-agent中,然后从文件系统中删除密钥以进一步保护它。
4. 现在将生成的公钥(<用户主目录>\.ssh\id_ed25519.pub)复制到要连接的服务器上。Windows没有提供用于执行此复制的工具,因此可以使用SCP完成。运行下面的命令将公钥复制到Linux机器上。
要从Linux复制到Windows:
5. 输入已登录用户的密码。一旦输入,PowerShell/Bash将复制密钥,然后您将与远程机器断开连接。
使用公钥身份验证连接到/从Windows/Linux
设置了公钥和私钥后,连接到/从Windows和Linux应该很容易。这几乎与基于密码的身份验证相同。
要在Windows上使用公钥进行连接,请使用如上所示的相同命令连接命令。您只会注意到一个区别;您不会收到凭据提示。
以下是使用-v
开关从Linux连接到Windows的示例,以查看连接过程中发生的情况。

-v
switch