如果需要誇平台 Windows <-> Linux 來遠端執行 PowerShell 指令,可以透過 SSH (SSH 使用非對稱式 與 對稱式加密來確保遠端連線的安全性,有興趣參考這一篇 – https://benjr.tw/301) 來遠端執行 PowerShell 指令.
在 PowerShell 下可以透過以下的指令來進行遠端執行.
New-PSSession , Enter-PSSession 與 Invoke-Command Cmdlet ,新的參數集(如下)可以支援 SSH 遠端連線的方式.
[-HostName <string>] [-UserName <string>] [-KeyFilePath <string>]
如同使用 SSH 在建立遠端連線時階段,需指定 HostName (目標電腦名稱或是 IP),並指定 UserName (使用者名稱),並搭配 KeyFilePath 參數使用私鑰檔案來做身份認證(不使用該參數時需輸入密碼).
所以我們需要在 Windows / Linux 平台下安裝以下程式.
- OpenSSH Client / Server
後面敘述. - PowerSheell 7
如果你要在非 Windows 平台遠端執行 Powershell 可以安裝 Powershell 7 版本,需至 https://github.com/PowerShell/PowerShell/releases 下載並安裝.
測試環境為 VMWare 虛擬機
- Windows 10 (1809) – IP:192.168.111.137
- Linux CentOS 7 – IP:192.168.111.204
Windows 10 (1809) – IP:192.168.111.137
從 Windows Server 2019 與 Windows 10 1809 就提供可獨立安裝的 OpenSSH 用戶端和 OpenSSH 伺服器元件.參考 https://docs.microsoft.com/zh-tw/windows-server/administration/openssh/openssh_install_firstuse 說明.
- 指令安裝 Windows SSH Client 與 Server
需 Administrator 權限,需選擇 Windows PowerShell (admin) 來執行以下指令,圖形安裝請參考 – https://benjr.tw/103097 .
安裝 OpenSSH ClientPS C:\Windows\system32> Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
安裝 OpenSSH Server
PS C:\Windows\system32> Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
啟動 SSHD 服務 (預設沒有啟動).
PS C:\Windows\system32> Start-Service sshd PS C:\Windows\system32> Set-Service -Name sshd -StartupType 'Automatic'
SSH 使用 TCP Port(埠) 22
PS C:\Windows\system32> Get-NetFirewallRule -Name *ssh* Name : OpenSSH-Server-In-TCP DisplayName : OpenSSH SSH Server (sshd) Description : Inbound rule for OpenSSH SSH Server (sshd) DisplayGroup : OpenSSH Server Group : OpenSSH Server Enabled : True Profile : Any Platform : {} Direction : Inbound Action : Allow EdgeTraversalPolicy : Block LooseSourceMapping : False LocalOnlyMapping : False Owner : PrimaryStatus : OK Status : The rule was parsed successfully from the store. (65536) EnforcementStatus : NotApplicable PolicyStoreSource : PersistentStore PolicyStoreSourceType : Local PS C:\Windows\system32> New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22 Name : sshd DisplayName : OpenSSH Server (sshd) Description : DisplayGroup : Group : Enabled : True Profile : Any Platform : {} Direction : Inbound Action : Allow EdgeTraversalPolicy : Block LooseSourceMapping : False LocalOnlyMapping : False Owner : PrimaryStatus : OK Status : The rule was parsed successfully from the store. (65536) EnforcementStatus : NotApplicable PolicyStoreSource : PersistentStore PolicyStoreSourceType : Local
- 安裝 PowerShell 7
請先至 https://github.com/PowerShell/PowerShell/releases 下載並安裝.
執行以下指令需 Administrator 權限,需選擇 Windows PowerShell (admin) 來執行.
編輯 C:\ProgramData\ssh\sshd_config 檔案.
確定使用密碼驗證(預設值)PasswordAuthentication yes
指定遠端電腦上使用 SSH 啟動 PowerShell 子系統,需注意 c:/progra~1/ (因為 C:\Program Files 包含空格的檔案路徑需使用 8.3 簡短名稱來取代) ,c:/progra~1/powershell/7/pwsh.exe 這是 PowerShell 7 的預設路徑.
Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo -NoProfile
需使用指令把 Powershell 預設 SHELL 設定為 PowerShell 7 (C:\Program Files\PowerShell\7\pwsh.exe)
PS C:\Windows\system32> New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "C:\Program Files\PowerShell\7\pwsh.exe" -PropertyType String -Force DefaultShell : C:\Program Files\PowerShell\7\pwsh.exe PSPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\OpenSSH PSParentPath : Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE PSChildName : OpenSSH PSDrive : HKLM PSProvider : Microsoft.PowerShell.Core\Registry
需重新啟動 SSHD 服務.
PS C:\Windows\system32> Restart-Service sshd
Linux CentOS 7 – IP:192.168.111.204
- 安裝 PowerShell 7
更多 OS 支援請參考 https://docs.microsoft.com/zh-tw/powershell/scripting/install/installing-powershell-core-on-linux?view=powershell-7[root@localhost ~]# curl https://packages.microsoft.com/config/rhel/7/prod.repo | sudo tee /etc/yum.repos.d [root@localhost ~]# yum install -y powershell
- 安裝 OpenSSH Client 與 Server
[root@localhost ~]# yum install openssh [root@localhost ~]# yum install openssh-server
編輯 /etc/ssh/sshd_config 檔案
[root@localhost ~]# vi /etc/ssh/sshd_config PasswordAuthentication yes Subsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile PubkeyAuthentication yes
重新啟動 sshd 服務.
[root@localhost ~]# systemctl restart sshd
Linux to Windows
從 CentOS 7 (IP:192.168.111.204) 端的 powershell 對 -> Windows10 (IP:192.168.111.137) 來執行 Powershell 指令.
在 CentOS 7 環境進入 powershell 環境.並將 Windows10 的 Hostname 與 UserName (預設無法使用 administrator) 儲存到變數 $session.
[root@localhost ~]# pwsh PowerShell 7.0.2 Copyright (c) Microsoft Corporation. All rights reserved. https://aka.ms/powershell Type 'help' to get help. PS /root> $session = New-PSSession -HostName 192.168.111.137 -UserName ben ben@192.168.111.137's password: PS /root> $session Id Name Transport ComputerName ComputerType State ConfigurationName Availability -- ---- --------- ------------ ------------ ----- ----------------- ------------ 3 Runspace2 SSH 192.168.111.137 RemoteMachine Opened DefaultShell Available
下面透過 Invoke-Command 以及 Enter-PSSession 指令來進行遠端 Powershell.
- Invoke-Command
Invoke-Command 可以直接遠端執行 PowerShell 指令.PS /root> Invoke-Command $session -ScriptBlock { Get-PSDrive } Name Used (GB) Free (GB) Provider Root CurrentLocation PSComputerName ---- --------- --------- -------- ---- --------------- -------------- Alias 192.168.111.137 C 36.06 23.34 C:\ Users\ben\Documents 192.168.111.137 Cert \ 192.168.111.137 D D:\ 192.168.111.137 Env 192.168.111.137 Function 192.168.111.137 HKCU HKEY_CURRENT_USER 192.168.111.137 HKLM HKEY_LOCAL_MACHINE 192.168.111.137 Temp 36.06 23.34 C:\Users\ben\AppData\Local\Temp\ 192.168.111.137 Variable 192.168.111.137 WSMan
- Enter-PSSession
Enter-PSSession 端入遠端,在遠端執行 PowerShell 指令.PS /root> Enter-PSSession $session [ben@192.168.111.137]: PS C:\Users\ben\Documents> Get-PSDrive Name Used (GB) Free (GB) Provider Root CurrentLocation ---- --------- --------- -------- ---- --------------- Alias Alias C 36.51 22.89 FileSystem C:\ Users\ben\Documents Cert Certificate \ D FileSystem D:\ Env Environment Function Function HKCU Registry HKEY_CURRENT_USER HKLM Registry HKEY_LOCAL_MACHINE Temp 36.51 22.89 FileSystem C:\Users\ben\AppData\Local\Temp\ Variable Variable WSMan WSMan