Linux和Windows的PSRemoting:操作指南

一项关于 PowerShell 在过去几年如何改变的伟大之处是它正在采用许多与非 Windows 机器交互的方式。其中一个变化是支持通过 SSH 进行 PSRemoting。通过 SSH 进行 PSRemoting 也意味着拥有 PSRemoting Linux!

虽然设置 PSRemoting 以与 SSH 和 Linux 一起工作需要一些设置才能正常工作,但这使您可以使用 PowerShell 与 Linux 机器进行原生交互。

在本教程中,您将学习如何设置 Windows 客户端以使用 PSRemoting over SSH 连接到 Linux 计算机(CentOS),反之亦然。您将学习如何使用密码证书进行身份验证。

相关:PowerShell Remoting:终极指南

先决条件

本教程将进行逐步讲解。如果您想跟着做,请确保提前具备以下条件:

  • 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 功能,并安装它们,因此它将同时安装客户端和服务器。

Get-WindowsCapability -Online | Where-Object {$_.Name -like 'OpenSSH*'} | Add-WindowsCapability -Online

如果您只想安装客户端,请将 `Where-Object` 脚本块中的过滤器更改为 `OpenSSH.Client*`,对于服务器,过滤器应为 `OpenSSH.Server*`。

相关: 使用 SSH 和 PowerShell 入门

启动 SSH 服务器

一旦安装了 OpenSSH,它将在端口 22 上打开 Windows 防火墙,但不会启动 OpenSSH 服务器服务以侦听该端口。要在 Windows Server 上启动 OpenSSH 服务器并设置服务在启动时启动,请运行以下 PowerShell 命令。

Start-Service sshd
Set-Service sshd -StartupType Automatic

配置 OpenSSH 配置

下一步是修改sshd_config守护进程配置文件。在这个文件中,您必须首先确认启用了密码身份验证,还要添加PowerShell子系统

本教程的这一部分是使用密码设置最简单的方法。您将在本教程后面学习如何使用证书设置SSH身份验证。

  1. 用您喜欢的文本编辑器打开配置文件,路径为C:\ProgramData\ssh\sshd_config

2.确认密码身份验证是否启用,其中PasswordAuthentication行是否以#开头被注释掉,或者设置为yes

Password Authentication

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机器默认已经安装了客户端和服务器,但您可以使用以下命令进行检查:

rpm -qa openssh*

如果已安装客户端和服务器,您应该会得到类似下面的输出。

Configuring OpenSSH

通过以下方式配置SSH配置文件:

  1. 通过运行sudo vi /etc/ssh/sshd_config打开sshd_config文件。

2. 添加PowerShell子系统,就像在Windows Server上添加以下行到配置文件一样。

Subsystem powershell /usr/bin/pwsh -sshs -NoLogo

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

  1. 打开您的PowerShell 7控制台。

2. 为Invoke-Command cmdlet设置参数。在这种情况下,以下参数将连接到一个名为SRV1的计算机,使用SRV1上的一个名为User的本地用户帐户。

$SessionParams = @{
     HostName = SRV1
     UserName = user
     SSHTransport = $true
 }

3. 通过展开上述参数并在脚本块内运行命令(在本例中是Get-Process)来运行Invoke-Command

相关: PowerShell Splatting: 是什么以及它是如何工作的?

Invoke-Command @SessionParams -ScriptBlock {Get-Process}

然后,您应该看到SRV1计算机上所有正在运行的进程的列表。

您还可以建立一个持久连接,允许您与之互连并交互式运行命令:

  1. 提供上述参数并将其传递给New-PSSession cmdlet。

2. 通过使用Enter-PSSession cmdlet 与该会话进行交互连接。

Create a persistent session
 $session = New-PSSession @SessionParams
 Connect interactively
 Enter-PSSession -Session $session

3. 在运行上述Enter-PSSession命令后,系统将提示您输入用户的密码。经过验证后,您将在 PowerShell 中连接到另一台计算机。

请注意,上述任何命令都不需要常见的Credential参数来提供用户名和密码进行连接。相反,我们使用了SSHTransport参数。SSH 不使用与 Windows 从一台 Windows 计算机到另一台计算机转移的相同身份验证过程,因此它无法解释 PSCredential 对象。

相关: 使用 PowerShell Get-Credential cmdlet 以及有关凭据的所有事宜。

使用这种方法,您还可以利用断开连接的会话

设置基于公钥的身份验证

虽然基于密码的身份验证设置简单且易于使用,但存在两个问题。

  • 没有办法在没有人手动安全运行命令的情况下进行身份验证。
  • 您正在通过网络发送密码。

虽然在SSH连接中加密了密码,但服务器以明文形式接收密码。如果服务器以某种方式受到 compromise,这可能成为安全问题。

生成公钥/私钥

在使用任何类型的公钥身份验证时,您必须首先从客户端生成公钥。此要求适用于Linux和Windows。

在Linux或Windows服务器机器上:

  1. 运行ssh-keygen以生成密钥对。

如果您在Linux上运行ssh-keygen,请注意它将默认生成RSA密钥对。许多新的Linux操作系统将不允许默认情况下使用RSA密钥对进行身份验证。要更正此错误,请使用ssh-keygen -t ed25519

2. 您将被提示提供存储私钥的路径和用于加密私钥的密码。如果您在身份验证期间不想提供密码,可以将密码留空。

3. 仅适用于Windows:从PowerShell运行下面的命令,其中<ProfilePath>是您配置文件的路径(可能是C:\Users\UserName)。

Set-Service ssh-agent -StartupType Automatic
 Start-Service ssh-agent
 ssh-add .ssh\id_ed25519
 Remove-Item ~.ssh\id_ed25519

Windows的OpenSSH实现具有一个ssh-agent服务,允许您将私钥存储在您登录的用户的Windows安全上下文中。这将使您能够将SSH私钥导入到ssh-agent中,然后从文件系统中删除密钥以进一步保护它。

4. 现在将生成的公钥(<用户主目录>\.ssh\id_ed25519.pub)复制到要连接的服务器上。Windows没有提供用于执行此复制的工具,因此可以使用SCP完成。运行下面的命令将公钥复制到Linux机器上。

scp C:\Users\Username.ssh\id_ed25519.pub username@ServerB:~/.ssh/authorized_keys

要从Linux复制到Windows:

scp ~/.ssh/id_ed25519.pub administrator@ServerA:.ssh/authorized_keys

5. 输入已登录用户的密码。一旦输入,PowerShell/Bash将复制密钥,然后您将与远程机器断开连接。

使用公钥身份验证连接到/从Windows/Linux

设置了公钥和私钥后,连接到/从Windows和Linux应该很容易。这几乎与基于密码的身份验证相同。

要在Windows上使用公钥进行连接,请使用如上所示的相同命令连接命令。您只会注意到一个区别;您不会收到凭据提示。

以下是使用-v开关从Linux连接到Windows的示例,以查看连接过程中发生的情况。

Example of connecting from Linux to Windows using the -v switch

Source:
https://adamtheautomator.com/psremoting-linux/