概觀
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
),讓您可以從電腦進行遠端存取。 OpenSSH for Windows 現已可用於 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 的預設 Shell,請參閱 為 OpenSSH 配置 Windows。
編輯位於
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 金鑰。
重新啟動 sshd 服務。
Restart-Service sshd
將 OpenSSH 安裝所在的路徑新增至您的 PATH 環境變數。 例如:
C:\Program Files\OpenSSH\
。 這個項目允許ssh.exe
找到 。
在Ubuntu Linux電腦上安裝SSH服務
安裝最新版本的 PowerShell,請參閱 在 Ubuntu 上安裝 PowerShell。
-
sudo apt install openssh-client sudo apt install openssh-server
在位置
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的方式而有所不同。
重新啟動 ssh 服務。
sudo systemctl restart sshd.service
在 macOS 電腦上安裝 SSH 服務
安裝最新版的PowerShell。 如需詳細資訊, 請在macOS上安裝PowerShell。
請依照下列步驟確定已啟用 SSH 遠端處理:
- 開啟
System Settings
。 - 按一下
General
- 按一下
Sharing
。 - 檢查
Remote Login
以設定Remote Login: On
。 - 允許適當的使用者存取。
- 開啟
在位置
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
重新啟動 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-PSSession
和Enter-PSHostProcess
在任何互動式遠程會話內運作。
另請參閱
- 在Linux 上安裝PowerShell
- 在macOS 上安裝PowerShell
- 在 Windows 上安裝 PowerShell
- 使用 OpenSSH 管理 Windows
- 管理 OpenSSH 金鑰
- Ubuntu SSH