SSH和PowerShell:設置Windows SSH客戶端

從前,你在使用 Windows PowerShell 進行遠程連接時,只能連接到特定類型的電腦。因為 PowerShell 遠程連接只支援 WsMan 提供者,所以你無法連接到運行 Linux 系統的電腦。然而在 2015 年,微軟推出了對 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。
  • A remote SSH server – All examples will use a Windows Server SSH machine. If you’re connecting to a Linux machine, you can skip the server setup steps.
  • 远程服务器上可用的TCP端口22

SSH客户端(Windows 10)设置

在打开PowerShell控制台之前,您首先需要执行一些一次性任务,以确保SSH和PowerShell能够协同工作,以确保Windows 10可以连接到远程SSH服务器。

将OpenSSH文件夹添加到PATH环境变量

OpenSSH已预装在Windows 10上,但有时需要一点帮助才能与PowerShell远程管理配合使用。如果您已经尝试使用Enter-PSSession连接到远程SSH系统,并遇到以下错误,请确保在PATH 环境变量中指定了OpenSSH可执行文件(ssh.exe)的路径。

Enter-PSSession : An error has occurred which PowerShell cannot handle. A remote session might have ended.

要將OpenSSH文件夾的路徑添加到PATH環境變量中,請點擊”開始”按鈕,然後搜索”進階系統設置”,再點擊”查看進階系統設置”,如下所示。

Adding OpenSSH folder path

當”系統內容”窗口彈出時,點擊”環境變量”按鈕。

Environment Variables in System Properties

在”環境變量”窗口中,在”系統變量”下,選擇”Path”,然後點擊”編輯”。

System Variables in the Environment Variables

在”編輯環境變量”窗口中,點擊”新建”,然後輸入”ssh.exe”可執行文件所在的路徑。本教程中,該路徑為”C:\Program Files\OpenSSH”,如下所示。輸入完成後,點擊兩次”確定”保存新值。

Editing Environment Variable

指定SSH子系統

現在,您需要為PowerShell指定SSH子系統,以在遠程Windows Server上通過SSH連接時調用。如果您沒有告訴PowerShell使用哪個子系統,您將不可避免地收到以下錯誤:

Enter-PSSession:背景處理報告了一個錯誤,錯誤信息如下:SSH客戶端會話以錯誤消息結束:在通道0上子系統請求失敗。

請注意,如果您不連接到Windows Server機器,則不需要執行這些步驟。

在遠程的 Windows 伺服器上,開啟 C:\ProgramData\ssh\ssh_config 檔案。往下捲動到 override default of no subsystems 部分的 ssh_config 檔案。該部分會如下的螢幕截圖所示。

Override Default of no Subsystems

在現有的 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 遠程操作。

首先,嘗試使用 Enter-PSSession 命令進入交互式會話。不同於您習慣的方式,您將 使用 ComputerName 參數。而是使用 HostName 參數指定遠程電腦。

預設情況下,PowerShell 遠程操作仍然使用 WsMan。要覆蓋默認設置,請使用 SSHTransport 參數指示您希望通過 SSH 和 PowerShell 進行連接。

當您首次使用使用者名稱和密碼進行連接時,您需要創建一個 SSH 私鑰。在提示時,請輸入 ‘y’ 接受。

Creating SSH Private Key

然後,您將被要求輸入您當前登錄的使用者的密碼。

請注意,此示例中的Windows 10客戶端和Windows Server SSH服務器位於同一個Active Directory域中。默認情況下,PowerShell Remoting將嘗試使用登錄的用戶進行身份驗證。您還可以使用參數指定不同的用戶名和密碼。

提供密碼後,您應該會看到熟悉的PowerShell Remoting提示符。

Powershell Remoting Prompt

現在退出會話使用exit,然後嘗試使用New-PSSession。注意下面使用與之前相同的HostNameSSHTransport參數,現在Transport顯示為SSH

您還可以使用ComputerName參數而不使用SSHTransport參數來使用WsMan作為傳輸協議。

您不需要使用SSH的用戶名和密碼。您可以使用私鑰文件並使用KeyFilePath參數指定其位置。

New PSSession Showing up SSH

不要忘記使用Get-PSSession | Remove-PSSession清理打開的會話!

總結

您現在應該知道如何設置Windows 10和Windows Server以使用PowerShell Remoting進行SSH。一旦配置完成,使用WsMan作為傳輸協議和使用SSH之間的唯一區別就是一些參數!

如果您想了解更多關於PowerShell和SSH的內容,請務必查看PowerShell Remoting over SSHMicrosoft的文檔文章

#PS7Now 貢獻者

本文是關於PowerShell 7系列的一部分,由下面優秀的貢獻者撰寫。請務必查看他們的文章並關注他們的部落格!

Author Twitter 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//
#PS7Now Contributors

Source:
https://adamtheautomator.com/powershell-ssh/