用於Linux和Windows的PSRemoting:操作指南

PowerShell 在过去几年中的一个伟大变化是它采用了许多与非 Windows 设备交互的方式。其中之一就是支持通过 SSH 进行 PSRemoting。PSRemoting over SSH 还意味着可以在 Linux 上使用 PSRemoting!

虽然设置 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(客户端)以使用 PSRemoting over SSH

首先,您需要在 Windows 客户端上配置 PSRemoting 客户端(PowerShell)。为此,您需要设置和配置 PowerShell 7+ 和 OpenSSH。

安装 PowerShell 7+

首先,安装 PowerShell 7+。本教程不会涵盖如何进行安装。要了解如何安装,请查看下面的链接。

安装 OpenSSH

您還需要安裝OpenSSH。OpenSSH是PSRemoting將用於連接到遠程Linux計算機的軟件包。您可以使用以下示例中的Get-WindowsCapability命令在PowerShell中安裝OpenSSH。

根據您的Windows主機是客戶端還是服務器,您需要安裝不同的Windows功能。如果您從Windows服務器連接到Linux,只需要安裝OpenSSH客戶端。如果您從Linux連接到Windows服務器,只需要安裝OpenSSH服務器。

以下命令查找名稱以OpenSSH開頭的所有Windows功能並安裝它們,因此它將安裝客戶端和服務器。

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

如果您只想安裝客戶端,請將Where-Object腳本塊中的過濾器更改為OpenSSH.Client*,對於服務器,過濾器應為OpenSSH.Server*

相關文章:使用SSH和PowerShell入門

啟動SSH服務器

一旦安裝了OpenSSH,它將在Windows防火牆上打開22端口,但不會啟動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. 確認啟用了密碼驗證,即密碼驗證行要么以 # 註釋開頭,要么設置為 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服務。您可以在PowerShell中運行 Restart-Service sshd 來執行此操作。

現在,您應該已經配置好了一切,可以使用PSRemoting over SSH連接到此Windows Server。(客戶端)(伺服器)

為PSRemoting over SSH設置Linux(服務器)

接下來是類似的設置Linux; 安裝PowerShell並配置OpenSSH。

請注意,由於我們使用的是CentOS,如果您使用不同的發行版,可能會有一些命令不同。

安裝PowerShell 7+

首先,安裝PowerShell 7。本教程不涉及如何操作。請務必查看以下鏈接。

相關信息:如何在Windows、macOS和Linux上下載和安裝PowerShell 7

配置OpenSSH

像Windows Server一樣,您需要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 和從 Linux 到 Windows 進行連接,並使用密碼驗證。

基於密碼的身份驗證看起來和使用帳戶名稱和密碼進行 SSH 連接非常相似。

連接命令

為了測試使用 PSRemoting 通過 SSH 從 Windows 到 Linux 或從 Linux 到 Windows 的連接,讓我們同時使用“臨時”會話和使用 Invoke-Command 命令和持久會話使用 New-PSSession

相關文章:Invoke-Command:遠程運行代碼的最佳方式

通過 Invoke-Command 測試 PSRemoting 連接:

  1. 打開你的 PowerShell 7 控制台。

2. 設置 Invoke-Command 命令的參數。在這種情況下,下面的參數將連接到一台名為 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連接中被加密,但服務器以明文形式接收密碼。如果服務器以某種方式被入侵,這可能會成為安全問題。

生成公鑰/私鑰

在使用任何類型的公鑰身份驗證時,您必須先從客戶端生成一個公鑰。這個要求適用於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/