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功能並安裝它們,因此它將安裝客戶端和服務器。
如果您只想安裝客戶端,請將
Where-Object
腳本塊中的過濾器更改為OpenSSH.Client*
,對於服務器,過濾器應為OpenSSH.Server*
。
相關文章:使用SSH和PowerShell入門
啟動SSH服務器
一旦安裝了OpenSSH,它將在Windows防火牆上打開22端口,但不會啟動OpenSSH服務器服務來監聽該端口。要在Windows Server上啟動OpenSSH服務器並設置服務在啟動時啟動,請運行以下PowerShell命令。
配置OpenSSH配置文件
下一步是修改sshd_config守護進程配置文件。在這個文件中,您必須首先確認啟用密碼驗證,並添加PowerShell子系統。
本教程的這一部分是使用密碼設置最簡單的方法。您將在本教程的後面學習如何使用憑證設置SSH驗證。
- 在您喜歡的文本編輯器中打開配置文件,位置是 C:\ProgramData\ssh\sshd_config。
2. 確認啟用了密碼驗證,即密碼驗證行要么以 #
註釋開頭,要么設置為 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服務。您可以在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機器已經默認安裝了客戶端和服務器,但您可以使用以下命令進行檢查:
如果已經安裝了客戶端和服務器,您應該得到與下面類似的輸出。

通過以下步驟配置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 和從 Linux 到 Windows 進行連接,並使用密碼驗證。
基於密碼的身份驗證看起來和使用帳戶名稱和密碼進行 SSH 連接非常相似。
連接命令
為了測試使用 PSRemoting 通過 SSH 從 Windows 到 Linux 或從 Linux 到 Windows 的連接,讓我們同時使用“臨時”會話和使用 Invoke-Command
命令和持久會話使用 New-PSSession
。
相關文章:Invoke-Command:遠程運行代碼的最佳方式
通過 Invoke-Command
測試 PSRemoting 連接:
- 打開你的 PowerShell 7 控制台。
2. 設置 Invoke-Command
命令的參數。在這種情況下,下面的參數將連接到一台名為 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連接中被加密,但服務器以明文形式接收密碼。如果服務器以某種方式被入侵,這可能會成為安全問題。
生成公鑰/私鑰
在使用任何類型的公鑰身份驗證時,您必須先從客戶端生成一個公鑰。這個要求適用於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