Externe communicatie van PowerShell via SSHPowerShell Remoting Over SSH

OverzichtOverview

PowerShell voor externe toegang gebruikt normaal gesproken WinRM verbinding-onderhandeling en gegevenstransport.PowerShell remoting normally uses WinRM for connection negotiation and data transport. SSH is gekozen voor deze implementatie voor externe toegang, omdat deze nu beschikbaar voor zowel Windows als Linux-platforms is en waar meerdere platforms PowerShell voor externe toegang kunt.SSH was chosen for this remoting implementation since it is now available for both Linux and Windows platforms and allows true multiplatform PowerShell remoting. WinRM biedt een robuuste hostingmodel echter ook voor externe PowerShell-sessies die deze implementatie wordt nog niet.However, WinRM also provides a robust hosting model for PowerShell remote sessions which this implementation does not yet do. En dit betekent dat PowerShell externe eindpunt-configuratie en JEA (Just Enough Administration) wordt nog niet ondersteund in deze implementatie.And this means that PowerShell remote endpoint configuration and JEA (Just Enough Administration) is not yet supported in this implementation.

PowerShell SSH voor externe toegang kunt u eenvoudige PowerShell-sessie voor externe toegang tussen Windows en Linux-machines.PowerShell SSH remoting lets you do basic PowerShell session remoting between Windows and Linux machines. Dit wordt gedaan door het maken van een PowerShell-proces op de doel-VM als een SSH-subsysteem te hosten.This is done by creating a PowerShell hosting process on the target machine as an SSH subsystem. Dit wordt uiteindelijk worden gewijzigd naar een meer algemene hostingmodel die vergelijkbaar is met de werking van WinRM ter ondersteuning van de configuratie van eindpunten en JEA.Eventually this will be changed to a more general hosting model similar to how WinRM works in order to support endpoint configuration and JEA.

De New-PSSession, Enter-PSSession en Invoke-Command cmdlets hebben nu een nieuwe parameterset om deze nieuwe verbinding voor externe toegang mogelijk te makenThe New-PSSession, Enter-PSSession and Invoke-Command cmdlets now have a new parameter set to facilitate this new remoting connection

[-HostName <string>]  [-UserName <string>]  [-KeyFilePath <string>]

Deze nieuwe parameterset waarschijnlijk zullen veranderen, maar voor nu kunt u maken van SSH PSSessions kunt u communiceren met vanaf de opdrachtregel of opdrachten en scripts aanroepen op.This new parameter set will likely change but for now allows you to create SSH PSSessions that you can interact with from the command line or invoke commands and scripts on. U opgeven van de doel-VM met de parameter hostnaam en gebruikersnaam van de naam van de gebruiker voorzien.You specify the target machine with the HostName parameter and provide the user name with UserName. Als de cmdlets interactief wordt uitgevoerd op de PowerShell-opdrachtregel wordt u gevraagd om een wachtwoord.When running the cmdlets interactively at the PowerShell command line you will be prompted for a password. Maar u hebt ook de optie voor het gebruik van verificatie van SSH-sleutel en geef het pad van een bestand met persoonlijke sleutel met de parameter KeyFilePath.But you also have the option to use SSH key authentication and provide a private key file path with the KeyFilePath parameter.

Algemene instellingenGeneral setup information

SSH is vereist om te worden geïnstalleerd op alle virtuele machines.SSH is required to be installed on all machines. U moet zowel client installeren (ssh.exe) en de server (sshd.exe) zodat u met externe toegang naar en van de machines experimenteren kunt.You should install both client (ssh.exe) and server (sshd.exe) so that you can experiment with remoting to and from the machines. Voor Windows moet u voor het installeren van Win32-OpenSSH vanuit GitHub.For Windows you will need to install Win32 OpenSSH from GitHub. Voor Linux moet u SSH (inclusief sshd-server) geschikt is voor uw platform installeren.For Linux you will need to install SSH (including sshd server) appropriate to your platform. U moet ook een recente PowerShell-build of een pakket van de SSH-functie voor externe communicatie met GitHub.You will also need a recent PowerShell build or package from GitHub having the SSH remoting feature. SSH-subsystemen tot stand brengen van een PowerShell-proces op de externe computer wordt gebruikt en de SSH-server moet worden geconfigureerd voor die.SSH subsystems is used to establish a PowerShell process on the remote machine and the SSH server will need to be configured for that. Bovendien moet u wachtwoordverificatie en eventueel sleutel gebaseerde verificatie inschakelen.In addition you will need to enable password authentication and optionally key based authentication.

Instellen op Windows-MachineSetup on Windows Machine

  1. Installeer de nieuwste versie van [PowerShell Core voor Windows]Install the latest version of [PowerShell Core for Windows]

    • U kunt zien dat als dat zo de SSH-ondersteuning voor externe communicatie is door te kijken naar de parameter wordt ingesteld voor New-PSSessionYou can tell if it has the SSH remoting support by looking at the parameter sets for New-PSSession
    Get-Command New-PSSession -syntax
    
    New-PSSession [-HostName] <string[]> [-Name <string[]>] [-UserName <string>] [-KeyFilePath <string>] [-SSHTransport] [<CommonParameters>]
    
  2. De meest recente [Win32 OpenSSH]-build installeren vanuit GitHub met behulp van de [installatie]-instructiesInstall the latest [Win32 OpenSSH] build from GitHub using the [installation] instructions

  3. Bewerk het bestand sshd_config op de locatie waar u Win32 OpenSSH geïnstalleerdEdit the sshd_config file at the location where you installed Win32 OpenSSH

    • Zorg ervoor dat de wachtwoordverificatie is ingeschakeldMake sure password authentication is enabled
    PasswordAuthentication yes
    
    Subsystem    powershell c:/program files/powershell/6.0.0/pwsh.exe -sshs -NoLogo -NoProfile
    

    Notitie

    Er is een fout in OpenSSH voor Windows waarmee wordt voorkomen dat spaties in subsysteem uitvoerbare paden werkt.There is a bug in OpenSSH for Windows that prevents spaces from working in subsystem executable paths. Zie dit probleem op GitHub voor meer informatie.See this issue on GitHub for more information.

    Eén oplossing is het maken van een symlink naar de Powershell-installatiemap die geen spaties bevatten:One solution is to create a symlink to the Powershell installation directory that does not contain spaces:

    mklink /D c:\pwsh "C:\Program Files\PowerShell\6.0.0"
    

    en geef de code in het subsysteem:and then enter it in the subsystem:

    Subsystem    powershell c:\pwsh\pwsh.exe -sshs -NoLogo -NoProfile
    
    Subsystem    powershell c:/program files/powershell/6.0.0/pwsh.exe -sshs -NoLogo -NoProfile
    
    • Verificatie met sleutel (optioneel) inschakelenOptionally enable key authentication
    PubkeyAuthentication yes
    
  4. De sshd-service opnieuw startenRestart the sshd service

    Restart-Service sshd
    
  5. Het pad waar OpenSSH is geïnstalleerd op uw pad Env variabele toevoegenAdd the path where OpenSSH is installed to your Path Env Variable

    • Dit moet zijn aan de regels van C:\Program Files\OpenSSH\This should be along the lines of C:\Program Files\OpenSSH\
    • Hiermee kunt u de ssh.exe worden gevondenThis allows for the ssh.exe to be found

Installatie op de Machine voor Linux (Ubuntu 14.04)Setup on Linux (Ubuntu 14.04) Machine

  1. De meest recente [PowerShell Core voor Linux]-build installeren vanuit GitHubInstall the latest [PowerShell Core for Linux] build from GitHub
  2. [Ubuntu SSH] indien nodig geïnstalleerdInstall [Ubuntu SSH] as needed

    sudo apt install openssh-client
    sudo apt install openssh-server
    
  3. Bewerk het bestand sshd_config op locatie /etc/sshEdit the sshd_config file at location /etc/ssh

    • Zorg ervoor dat de wachtwoordverificatie is ingeschakeldMake sure password authentication is enabled
    PasswordAuthentication yes
    
    • Een PowerShell-subsysteem-item toevoegenAdd a PowerShell subsystem entry
    Subsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile
    
    • Verificatie met sleutel (optioneel) inschakelenOptionally enable key authentication
    PubkeyAuthentication yes
    
  4. De sshd-service opnieuw startenRestart the sshd service

    sudo service sshd restart
    

Instellen op MacOS-computerSetup on MacOS Machine

  1. Installeer de nieuwste build van de [PowerShell Core voor MacOS]Install the latest [PowerShell Core for MacOS] build
    • Zorg ervoor dat SSH voor externe toegang is ingeschakeld door de volgende stappen:Make sure SSH Remoting is enabled by following these steps:
      • Open System PreferencesOpen System Preferences
      • Klik op SharingClick on Sharing
      • Controleer Remote Login -melding Remote Login: OnCheck Remote Login - Should say Remote Login: On
      • Toegang tot de juiste gebruikers toestaanAllow access to appropriate users
  2. Bewerk de sshd_config -bestand op locatie /private/etc/ssh/sshd_configEdit the sshd_config file at location /private/etc/ssh/sshd_config

    • Uw favoriete editor gebruiken ofUse your favorite editor or

      sudo nano /private/etc/ssh/sshd_config
      
    • Zorg ervoor dat de wachtwoordverificatie is ingeschakeldMake sure password authentication is enabled

      PasswordAuthentication yes
      
    • Een PowerShell-subsysteem-item toevoegenAdd a PowerShell subsystem entry

      Subsystem powershell /usr/local/bin/pwsh -sshs -NoLogo -NoProfile
      
    • Verificatie met sleutel (optioneel) inschakelenOptionally enable key authentication

      PubkeyAuthentication yes
      
  3. De sshd-service opnieuw startenRestart the sshd service

    sudo launchctl stop com.openssh.sshd
    sudo launchctl start com.openssh.sshd
    

Voorbeeld van PowerShell voor externe toegangPowerShell Remoting Example

De eenvoudigste manier om te testen voor externe toegang is om te proberen deze slechts op één computer.The easiest way to test remoting is to just try it on a single machine. Ik zal hier een externe sessie naar dezelfde computer op een Linux-vak maken.Here I will create a remote session back to the same machine on a Linux box. U ziet dat ik ben met behulp van PowerShell-cmdlets vanaf een opdrachtprompt, zodat we ziet u aanwijzingen uit in SSH waarin wordt gevraagd om te controleren of de hostcomputer, evenals een wachtwoord wordt gevraagd.Notice that I am using PowerShell cmdlets from a command prompt so we see prompts from SSH asking to verify the host computer as well as password prompts. U kunt hetzelfde doen op een Windows-machine om ervoor te zorgen voor externe toegang werkt er en vervolgens extern tussen machines wijzig gewoon de naam van de host.You can do the same thing on a Windows machine to ensure remoting is working there and then remote between machines by simply changing the host name.

#
# Linux to Linux
#
$session = New-PSSession -HostName UbuntuVM1 -UserName TestUser
The authenticity of host 'UbuntuVM1 (9.129.17.107)' cannot 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~14.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 to 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 to 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>

Bekende problemenKnown Issues

  • sudo-opdracht werkt niet in de externe sessie op Linux-machine.sudo command does not work in remote session to Linux machine.

Zie ookSee Also

PowerShell Core voor WindowsPowerShell Core for Windows

PowerShell Core voor LinuxPowerShell Core for Linux

PowerShell Core voor MacOSPowerShell Core for MacOS

Win32-OpenSSHWin32 OpenSSH

installatieinstallation

Ubuntu SSHUbuntu SSH