透過 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-PSSession
、Enter-PSSession
與 Invoke-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 電腦上安裝 SSH 服務
安裝最新版的 PowerShell。 如需詳細資訊,請參閱 在 Windows 上安裝 PowerShell。
您可以列出
New-PSSession
參數集來確認 PowerShell 具有 SSH 遠端支援。 您會注意到以 SSH 開頭的參數集名稱。 這些參數集包括 SSH 參數。(Get-Command New-PSSession).ParameterSets.Name
Name ---- SSHHost SSHHostHashParam
安裝最新的 Win32 OpenSSH。 如需安裝指示,請參閱開始使用 OpenSSH。
注意
如果您想要將 PowerShell 設定為 OpenSSH 的預設殼層,請參閱為 OpenSSH 設定 Windows。
編輯位於
$env:ProgramData\ssh
的sshd_config
檔案。確定已啟用密碼驗證:
PasswordAuthentication yes
在遠端電腦上建立裝載 PowerShell 處理程序的 SSH 子系統:
Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -nologo
注意
從 PowerShell 7.4 開始,您不再需要在 SSH 伺服器模式中執行 PowerShell 時使用
-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 金鑰。
重新啟動 sshd 服務。
Restart-Service sshd
將 OpenSSH 安裝所在的路徑新增至 Path 環境變數。 例如:
C:\Program Files\OpenSSH\
。 此項目可允許程式找到ssh.exe
。
在 Ubuntu Linux 電腦上安裝 SSH 服務
-
sudo apt install openssh-client sudo apt install openssh-server
編輯
/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 的方式而有所不同。注意
從 PowerShell 7.4 開始,您不再需要在 SSH 伺服器模式中執行 PowerShell 時使用
-nologo
參數。重新啟動 ssh 服務。
sudo systemctl restart sshd.service
在 macOS 電腦上安裝 SSH 服務
安裝最新版的 PowerShell。 如需詳細資訊, 請在 macOS 上安裝 PowerShell。
確定已遵循下列步驟來啟用 SSH 遠端:
- 開啟
System Preferences
。 - 按一下
General
- 按一下
Sharing
。 - 選取
Remote Login
以設定Remote Login: On
。 - 允許適當的使用者存取。
- 開啟
編輯
/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 的方式而有所不同。注意
從 PowerShell 7.4 開始,您不再需要在 SSH 伺服器模式中執行 PowerShell 時使用
-nologo
參數。選擇性啟用金鑰驗證:
PubkeyAuthentication yes
重新啟動 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 到 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 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 到 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
。 一旦進入工作階段之後,即可透過完整的 FilePath,使用點執行來載入設定檔。 這與 SSH 設定檔無關。 您可將 SSH 伺服器設定為使用 PowerShell 作為預設的 Shell,並透過 SSH 載入設定檔。 如需詳細資訊,請參閱 SSH 文件。在 PowerShell 7.1 之前,透過 SSH 遠端處理不支援第二個躍點遠端會話。 這項功能僅限於使用 WinRM 的工作階段。 PowerShell 7.1 可讓
Enter-PSSession
與Enter-PSHostProcess
在任何互動式遠端工作階段中作業。