Windows / Linux – 透過 SSH 來遠端執行 PowerShell 指令

Loading

如果需要誇平台 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 說明.

  1. 指令安裝 Windows SSH Client 與 Server
    需 Administrator 權限,需選擇 Windows PowerShell (admin) 來執行以下指令,圖形安裝請參考 – https://benjr.tw/103097 .
    安裝 OpenSSH Client

    PS 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
    
  2. 安裝 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

  1. 安裝 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
    
  2. 安裝 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.

  1. 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             
    
  2. 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       
    
沒有解決問題,試試搜尋本站其他內容

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料