共用方式為


透過 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),讓您可以從電腦進行遠端存取。 OpenSSH for Windows 現已可用於 Windows 10 組建 1809 及 Windows Server 2019。 如需詳細資訊,請參閱 使用 OpenSSH 管理 Windows。 針對 Linux,請安裝 SSH,包括適用於您平臺的 sshd 伺服器。 您也需要從 GitHub 安裝 PowerShell,以便取得 SSH 遠端存取功能。 SSH 伺服器必須設定為建立 SSH 子系統,以在遠端電腦上裝載 PowerShell 進程。 而且,您必須啟用 密碼金鑰型 驗證。

在 Windows 電腦上安裝 SSH 服務

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

    您可以列出 New-PSSession 參數集,以確認 PowerShell 支援 SSH 遠端操作。 您會發現有以 SSH 開頭的參數集名稱。 這些參數集包含 SSH 參數。

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

    備註

    如果您想要將 PowerShell 設定為 OpenSSH 的預設 Shell,請參閱 為 OpenSSH 配置 Windows

  3. 編輯位於sshd_config$Env:ProgramData\ssh檔案。

    • 請確定已啟用密碼驗證:

      PasswordAuthentication yes
      
    • 在遠端電腦上建立以 PowerShell 進程為主機的 SSH 子系統:

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

      備註

      Windows 的 OpenSSH 中有一個錯誤,可讓您使用具有子系統可執行檔空格的路徑。 有兩種方式可以解決此問題:

      • 使用 PowerShell 可執行文件路徑的 Windows 8.3 樣式 簡短名稱
      • 建立 PowerShell 可執行文件的符號連結,導致路徑沒有空格

      如需詳細資訊,請參閱 PowerShell/Win32-OpenSSH 存放庫中 的問題 #784

      您只需要取得包含空間之路徑區段的 8.3 樣式名稱。 根據預設,PowerShell 7 會安裝在 中 C:\Program Files\PowerShell\7\。 的 8.3 樣式名稱 Program Files 應該是 progra~1。 您可以使用下列命令來驗證名稱:

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

      8.3 名稱是NTFS檔案系統的舊版功能,可以停用。 必須針對安裝PowerShell的磁碟區啟用此功能。

      或者,您可以建立 PowerShell 可執行文件的符號連結,以產生沒有空格的路徑。 此方法是慣用方法,因為它可讓您在PowerShell可執行檔的路徑變更時更新連結,而不需要更新檔案 sshd_config

      使用下列命令來建立可執行檔案的符號連結:

      $newItemSplat = @{
           ItemType = 'SymbolicLink'
           Path = 'C:\ProgramData\ssh\'
           Name = 'pwsh.exe'
           Value = (Get-Command pwsh.exe).Source
      }
      New-Item @newItemSplat
      

      此命令會在 OpenSSH 伺服器用來儲存主機金鑰和其他組態的相同目錄中建立符號連結。

    • 選擇性地啟用金鑰驗證:

      PubkeyAuthentication yes
      

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

  4. 重新啟動 sshd 服務。

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

在Ubuntu Linux電腦上安裝SSH服務

  1. 安裝最新版本的 PowerShell,請參閱 在 Ubuntu 上安裝 PowerShell

  2. 安裝 Ubuntu OpenSSH 伺服器

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

    • 請確定已啟用密碼驗證:

      PasswordAuthentication yes
      
    • 選擇性地啟用金鑰驗證:

      PubkeyAuthentication yes
      

      如需在Ubuntu上建立 SSH 金鑰的詳細資訊,請參閱 ssh-keygen 的 manpage。

    • 新增 PowerShell 子系統項目:

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

      備註

      PowerShell 可執行檔案的預設位置是 /usr/bin/pwsh。 位置可能會因您安裝PowerShell的方式而有所不同。

  4. 重新啟動 ssh 服務。

    sudo systemctl restart sshd.service
    

在 macOS 電腦上安裝 SSH 服務

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

    請依照下列步驟確定已啟用 SSH 遠端處理:

    1. 開啟 System Settings
    2. 按一下 General
    3. 按一下 Sharing
    4. 檢查 Remote Login 以設定 Remote Login: On
    5. 允許適當的使用者存取。
  2. 在位置 sshd_config 編輯 /private/etc/ssh/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 組態檔。 請務必在升級之後檢查組態檔。

認證

透過 SSH 的 PowerShell 遠端存取依賴 SSH 用戶端與 SSH 服務之間的驗證交換,而且 PowerShell 本身不會實作任何驗證機制。 結果是任何已設定的驗證配置,包括多重要素驗證都是由 SSH 處理,且與 PowerShell 無關。 例如,您可以設定 SSH 服務以要求公鑰驗證和一次性密碼,以增加安全性。 多重要素驗證的設定超出本文件的範圍。 請參閱 SSH 文件,以瞭解如何正確設定多重要素驗證,並驗證它在 PowerShell 外部正常運作後,再嘗試將其與 PowerShell 遠端連線一起使用。

備註

使用者會在遠程會話中保留相同的許可權。 也就是說,系統管理員可以存取具有提升權限的命令介面,而一般使用者則無法存取。

PowerShell 遠程範例

測試遠端控制的最簡單的方法是在單一電腦上試用。 在此範例中,我們會建立一個連回相同 Linux 計算機的遠端連線。 我們以互動方式使用PowerShell Cmdlet,因此我們看到SSH中的提示要求驗證主計算機,並提示輸入密碼。 您可以在 Windows 電腦上做同樣的事,以確保遠端連線正常運作。 然後,透過變更主機名稱來在電腦之間進行遠端連接。

從 Linux 到 Linux

$session = New-PSSession -HostName UbuntuVM1 -UserName TestUser
The authenticity of host 'UbuntuVM1 (9.129.17.107)' can't 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 pwsh }
Handles  NPM(K)    PM(K)      WS(K)     CPU(s)     Id  SI ProcessName    PSComputerName
-------  ------    -----      -----     ------     --  -- -----------    --------------
      0       0        0         19       3.23  10635 635 pwsh           UbuntuVM1
      0       0        0         21       4.92  11033 017 pwsh           UbuntuVM1
      0       0        0         20       3.07  11076 076 pwsh           UbuntuVM1

Linux 到 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 到 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。 在工作階段中之後,您可以透過點來源配置檔與完整檔案路徑來載入設定檔。 這與 SSH 配置檔無關。 您可以將 SSH 伺服器設定為使用 PowerShell 作為預設的 shell,並透過 SSH 載入設定檔案。 如需詳細資訊,請參閱 SSH 檔。

  • 在 PowerShell 7.1 之前,透過 SSH 進行遠端處理不支援第二個躍點遠端會話。 這項功能僅限於使用 WinRM 的會話。 PowerShell 7.1 允許 Enter-PSSessionEnter-PSHostProcess 在任何互動式遠程會話內運作。

另請參閱