透過 SSH 的 PowerShell 遠端處理

概觀

PowerShell 遠端通常會使用 WinRM 進行連線交涉和資料傳輸。 SSH 目前適用於 Linux 與 Windows 平台,而且能夠執行真正的多平台 PowerShell 遠端功能。

WinRM 提供一個健全裝載模型以供 PowerShell 遠端工作階段使用。 SSH 遠端功能目前不支援遠端端點設定和 Just Enough Administration (JEA)。

SSH 遠端功能可讓您在 Windows 與 Linux 電腦之間執行基本 PowerShell 工作階段遠端功能。 SSH 遠端功能會在目標電腦上建立 PowerShell 裝載處理序作為 SSH 子系統。 最後,我們將實作一般裝載模型 (類似 WinRM) 以支援端點設定與 JEA。

New-PSSessionEnter-PSSessionInvoke-Command Cmdlet 現在有新的參數集,可支援這個新的遠端連線。

[-HostName <string>]  [-UserName <string>]  [-KeyFilePath <string>]

若要建立遠端工作階段,請使用 HostName 參數來指定目標電腦,並使用 UserName 來提供使用者名稱。 以互動方式執行 Cmdlet 時,系統會提示您輸入密碼。 您也可以搭配 KeyFilePath 參數使用私密金鑰檔案來設定 SSH 金鑰驗證。 建立 SSH 驗證金鑰的步驟會因平台而有所不同。

一般安裝資訊

PowerShell 6 或更新版本,且必須在所有電腦上安裝 SSH。 請同時安裝 SSH 用戶端 (ssh.exe) 與伺服器 (sshd.exe),讓您可從遠端往返電腦。 適用於 Windows 的 OpenSSH 現在已可在 Windows 10 組建 1809 與 Windows Server 2019 中使用。 如需詳細資訊,請參閱使用 OpenSSH 管理 Windows。 針對 Linux,安裝您平台適用的 SSH (包括 sshd 伺服器)。 您也需要從 GitHub 安裝 PowerShell 來取得 SSH 遠端功能。 SSH 伺服器必須設定為建立 SSH 子系統,以便在遠端電腦上裝載 PowerShell 處理序。 而且,您也必須設定啟用 密碼金鑰型 的驗證。

在 Windows 電腦上設定

  1. 安裝最新版的 PowerShell。 如需詳細資訊,請參閱在 Windows 上安裝 PowerShell Core

    您可以列出 New-PSSession 參數集來確認 PowerShell 具有 SSH 遠端支援。 您會注意到以 SSH 開頭的參數集名稱。 這些參數集包括 SSH 參數。

    (Get-Command New-PSSession).ParameterSets.Name
    
    Name
    ----
    SSHHost
    SSHHostHashParam
    
  2. 安裝最新的 Win32 OpenSSH。 如需安裝指示,請參閱開始使用 OpenSSH

    注意

    如果您想要將 PowerShell 設定為 OpenSSH 的預設殼層,請參閱為 OpenSSH 設定 Windows

  3. 編輯位於 $env:ProgramData\sshsshd_config 檔案。

    確定已啟用密碼驗證:

    PasswordAuthentication yes
    

    在遠端電腦上建立裝載 PowerShell 處理程序的 SSH 子系統:

    Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo
    

    注意

    PowerShell 可執行檔的預設位置為 c:/progra~1/powershell/7/pwsh.exe。 該位置會根據您安裝 PowerShell 的方式而有所不同。

    您必須針對任何包含空格的檔案路徑使用 8.3 簡短名稱。 OpenSSH for Windows 中有一個 Bug,會讓空格無法在子系統可執行檔路徑中運作。 如需詳細資訊,請參閱此 GitHub 問題

    Windows 中 Program Files 資料夾的 8.3 簡短名稱通常是 Progra~1。 但您可以使用下列命令來確保:

    Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' |
      Select-Object EightDotThreeFileName
    
    EightDotThreeFileName
    ---------------------
    c:\progra~1
    

    選擇性啟用金鑰驗證:

    PubkeyAuthentication yes
    

    如需詳細資訊,請參閱管理 OpenSSH 金鑰

  4. 重新啟動 sshd 服務。

    Restart-Service sshd
    
  5. 將 OpenSSH 安裝所在的路徑新增至 Path 環境變數。 例如: C:\Program Files\OpenSSH\ 。 此項目可允許程式找到 ssh.exe

在 Ubuntu 16.04 Linux 電腦上設定

  1. 安裝最新版的 PowerShell,請參閱在 Linux 上安裝 PowerShell Core

  2. 安裝 Ubuntu OpenSSH Server

    sudo apt install openssh-client
    sudo apt install openssh-server
    
  3. 編輯 /etc/ssh 位置中的 sshd_config 檔案。

    確定已啟用密碼驗證:

    PasswordAuthentication yes
    

    選擇性啟用金鑰驗證:

    PubkeyAuthentication yes
    

    如需在 Ubuntu 上建立 SSH 金鑰的相關詳細資訊,請參閱 ssh-keygen 的手冊頁。

    新增 PowerShell 子系統項目:

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

    注意

    PowerShell 可執行檔的預設位置為 /usr/bin/pwsh。 該位置會根據您安裝 PowerShell 的方式而有所不同。

  4. 重新啟動 ssh 服務。

    sudo service ssh restart
    

在 macOS 電腦上設定

  1. 安裝最新版的 PowerShell。 如需詳細資訊,請參閱在 macOS 上安裝 PowerShell Core

    確定已遵循下列步驟來啟用 SSH 遠端:

    1. 開啟 System Preferences
    2. 按一下 Sharing
    3. 選取 Remote Login 以設定 Remote Login: On
    4. 允許適當的使用者存取。
  2. 編輯 /private/etc/ssh/sshd_config 位置中的 sshd_config 檔案。

    開啟文字編輯器,例如 nano

    sudo nano /private/etc/ssh/sshd_config
    

    確定已啟用密碼驗證:

    PasswordAuthentication yes
    

    新增 PowerShell 子系統項目:

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

    注意

    PowerShell 可執行檔的預設位置為 /usr/local/bin/pwsh。 該位置會根據您安裝 PowerShell 的方式而有所不同。

    選擇性啟用金鑰驗證:

    PubkeyAuthentication yes
    
  3. 重新啟動 sshd 服務。

    sudo launchctl stop com.openssh.sshd
    sudo launchctl start com.openssh.sshd
    

驗證

透過 SSH 的 PowerShell 遠端功能需要在 SSH 用戶端與 SSH 服務之間交換驗證,且本身不會實作任何驗證配置。 結果是,任何已設定的驗證配置 (包括多重要素驗證) 都是由 SSH 處理,與 PowerShell 無關。 例如,您可以設定 SSH 服務要求公開金鑰驗證及單次密碼來增強安全性。 設定多重要素驗證不在本文件的討論範圍內。 請參閱 SSH 文件,以了解如何正確地設定多重要素驗證,並驗證它在 PowerShell 之外是否運作正常,再嘗試與 PowerShell 遠端功能搭配使用。

注意

使用者會在遠端工作階段中保留相同的權限。 也就是說,系統管理員可存取提高權限的 Shell,而一般使用者則無法存取。

PowerShell 遠端範例

測試遠端功能的最簡單方式是在單一電腦上進行試用。 在此範例中,我們會建立回到相同 Linux 電腦的遠端工作階段。 我們會以互動方式使用 PowerShell Cmdlet;因此,我們會看到要求驗證主機電腦的 SSH 提示以及密碼提示。 您可以在 Windows 電腦上執行相同的動作以確保遠端功能正在運作。 接著,透過變更主機名稱,在電腦之間執行遠端功能。

# Linux to Linux
#
$session = New-PSSession -HostName UbuntuVM1 -UserName TestUser
The authenticity of host 'UbuntuVM1 (9.129.17.107)' cannot be established.
ECDSA key fingerprint is SHA256:2kCbnhT2dUE6WCGgVJ8Hyfu1z2wE4lifaJXLO7QJy0Y.
Are you sure you want to continue connecting (yes/no)?
TestUser@UbuntuVM1s password:
$session
 Id Name   ComputerName    ComputerType    State    ConfigurationName     Availability
 -- ----   ------------    ------------    -----    -----------------     ------------
  1 SSH1   UbuntuVM1       RemoteMachine   Opened   DefaultShell             Available
Enter-PSSession $session
[UbuntuVM1]: PS /home/TestUser> uname -a
Linux TestUser-UbuntuVM1 4.2.0-42-generic 49~16.04.1-Ubuntu SMP Wed Jun 29 20:22:11 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

[UbuntuVM1]: PS /home/TestUser> Exit-PSSession
Invoke-Command $session -ScriptBlock { Get-Process powershell }
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName                    PSComputerName
-------  ------    -----      -----     ------     --  -- -----------                    --------------
      0       0        0         19       3.23  10635 635 powershell                     UbuntuVM1
      0       0        0         21       4.92  11033 017 powershell                     UbuntuVM1
      0       0        0         20       3.07  11076 076 powershell                     UbuntuVM1
#
# Linux to Windows
#
Enter-PSSession -HostName WinVM1 -UserName PTestName
PTestName@WinVM1s password:
[WinVM1]: PS C:\Users\PTestName\Documents> cmd /c ver
Microsoft Windows [Version 10.0.10586]
#
# Windows to Windows
#
C:\Users\PSUser\Documents>pwsh.exe
PowerShell
Copyright (c) Microsoft Corporation. All rights reserved.
$session = New-PSSession -HostName WinVM2 -UserName PSRemoteUser
The authenticity of host 'WinVM2 (10.13.37.3)' can't be established.
ECDSA key fingerprint is SHA256:kSU6slAROyQVMEynVIXAdxSiZpwDBigpAF/TXjjWjmw.
Are you sure you want to continue connecting (yes/no)?
Warning: Permanently added 'WinVM2,10.13.37.3' (ECDSA) to the list of known hosts.
PSRemoteUser@WinVM2's password:
$session
 Id Name            ComputerName    ComputerType    State         ConfigurationName     Availability
 -- ----            ------------    ------------    -----         -----------------     ------------
  1 SSH1            WinVM2          RemoteMachine   Opened        DefaultShell             Available
Enter-PSSession -Session $session
[WinVM2]: PS C:\Users\PSRemoteUser\Documents> $PSVersionTable

Name                           Value
----                           -----
PSEdition                      Core
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
SerializationVersion           1.1.0.1
BuildVersion                   3.0.0.0
CLRVersion
PSVersion                      6.0.0-alpha
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
GitCommitId                    v6.0.0-alpha.17


[WinVM2]: PS C:\Users\PSRemoteUser\Documents>

限制

  • sudo 命令不適用於 Linux 電腦的遠端工作階段。

  • 透過 SSH 的 PSRemoting 不支援設定檔,且沒有 $PROFILE 的存取權。 一旦進入工作階段之後,即可透過完整的 FilePath,使用點執行來載入設定檔。 這與 SSH 設定檔無關。 您可將 SSH 伺服器設定為使用 PowerShell 作為預設的 Shell,並透過 SSH 載入設定檔。 如需詳細資訊,請參閱 SSH 文件。

  • 在 PowerShell 7.1 之前,透過 SSH 進行遠端處理不支援第二躍點遠端工作階段。 這項功能僅限於使用 WinRM 的工作階段。 PowerShell 7.1 可讓 Enter-PSSessionEnter-PSHostProcess 在任何互動式遠端工作階段中作業。

另請參閱

在 Linux 上安裝 PowerShell Core

在 macOS 上安裝 PowerShell Core

在 Windows 上安裝 PowerShell Core

使用 OpenSSH 管理 Windows

管理 OpenSSH 金鑰

Ubuntu SSH