your123 - stock.adobe.com

So richten Sie PowerShell-Remoting über SSH ein

Microsoft empfiehlt die Verwendung von WinRM für die Fernverwaltung von Windows-Rechnern, aber OpenSSH bietet Vorteile, insbesondere in Unternehmen, die auch Linux-Systeme einsetzen.

Wenn Sie in einer gemischten Betriebssystemumgebung arbeiten, sind PowerShell und SSH eine gute Kombination für die Fernverwaltung.

Als Microsoft 2016 sein PowerShell-Automatisierungs-Tool als Open Source zur Verfügung stellte, war einer der Gründe dafür die Entwicklung plattformübergreifender Kompatibilität, um macOS- und Linux-Systeme einzubeziehen. Um PowerShell-Remoting auf Linux-Systemen zu ermöglichen, war es keine Überraschung, dass das PowerShell-Team dafür SSH-Konnektivität implementierte. Weiterhin gilt SSH als Standard für das Remoting. Erfahren Sie, wie sich PowerShell-Remoting für SSH von herkömmlichen Remote-Verwaltungsmethoden in einer Windows-Umgebung unterscheidet, und lernen Sie die Grundlagen für die Verwendung von Remoting über SSH für Windows- und Linux-Computer kennen.

Was ist der Unterschied zwischen Remoting mit SSH und WinRM?

Die Windows-Remote-Verwaltung (WinRM) – die Microsoft-Version des Webdienste-Verwaltungsprotokolls – ist die herkömmliche Methode zur Fernverwaltung von Windows.

Geben Sie den Befehl winrm quickconfig über das Ausführen-Menü ein, um den WinRM-Dienst unter Windows zu starten. WinRM ist ein nativer Windows-Dienst, den PowerShell seit Version 2.0 unter Windows 7 und Windows Server 2008 unterstützt.

SSH ist das Standart-Remoting-Tool für Linux. Microsoft hat die native Unterstützung auf Clients mit mindestens Windows 10 1809 und Servern mit mindestens Windows Server 2019 mit der optionalen OpenSSH-Funktion hinzugefügt.

Die Entscheidung zwischen SSH und WinRM als das Remoting-Protokoll Ihrer Wahl ist einfach zu treffen. Nach wie vor empfiehlt Microsoft WinRM, da es in der Windows-Umgebung ausgereicht ist und einige zusätzliche Funktionen unterstützt, die SSH nicht bietet. Zum Beispiel die Remote-Endpunktkonfiguration und Just Enough Administration (JEA).

Wenn Sie jedoch Windows in eine Linux-Umgebung einführen, in der Ihr Konfigurationsmanagement-Tool, wie beispielsweise Ansible, bereits für SSH auf Port 22 konfiguriert ist, dann ist es sinnvoll, bei SSH zu bleiben. Obwohl das derzeit noch als experimentell angesehen wird, unterstützt Ansible die Verwaltung von Windows über SSH.

Die Voraussetzungen für PowerShell-Remoting über SSH sind PowerShell 7+ und SSH.

Der Zielcomputer benötigt einen SSH-Server und der Quellcomputer benötigt einen SSH-Client. OpenSSH wird für Windows sowohl für den Server als auch für den Client in seiner jeweiligen Variante empfohlen.

So richten Sie OpenSSH unter Windows ein

Der einfachste Weg, SSH-Remoting unter Windows einzurichten, erfordert mindestens Windows Server 2019 oder Windows 10 1809. Mit einem dieser Betriebssysteme und der PowerShell 7, die als Administrator ausgeführt wird, überprüfen Sie die OpenSSH-Funktion mit dem folgenden PowerShell-Befehl:

Get-WindowsCapability -Online | ?{$_.Name -like ‘OpenSSH *‘}

PowerShell
Abbildung 1: Um den Status von OpenSSH auf dem System zu überprüfen, verwenden Sie PowerShell.

Abbildung 1 zeigt, dass der SSH-Client installiert ist, der Standard. Mit dem folgenden Befehl installieren Sie den SSH-Server:

Add-WindowsCapability -Online -Name “OpenSSH.Server~~~~0.0.1.0“

Abschließend starten Sie den SSH-Dienst:

Start-Service sshd

Mit dem PowerShell-Modul RemotingTools von Microsoft führen Sie den Rest der SSH-Konfiguration durch. Um das Modul und sein Cmdlet zu installieren und so einen Teil der SSH-Konfiguration zu übernehmen, führen Sie die folgenden Befehle aus:

Install-Module Microsoft.PowerShell.RemotingTools

Enable-SSHRemoting

Cmdlet Enable-SSHRemoting
Abbildung 2: Das Cmdlet Enable-SSHRemoting verarbeitet Aktualisierungen des SSHD-Dienstes und andere Aufgaben im Zusammenhang mit der SSH-Konfiguration.

Führen Sie die Hilfe für das cmdlet aus, um alle Aufgaben anzuzeigen, die dieser PowerShell-Befehl im Zusammenhang mit SSH-Remoting ausführt:

help Enable-SSHRemoting

Der letzte Schritt besteht darin, den Dienst neu zu starten:

Restart-Service sshd

So richten Sie OpenSSH für PowerShell unter Linux ein

Je nach Linux-Distribution sind die Schritte zur Installation von SSH unter Linux unterschiedlich. In diesem Artikel wird die Konfiguration für Ubuntu 22.04, das apt, das Advanced Packaging Tool von Ubuntu, für die Paketverwaltung verwendet. Wenn Sie PowerShell installieren, führen Sie diesen Befehl aus:

sudo apt install powershell

Sie benötigen auch den SSH-Client und -Server, die in der Regel in Linux vorinstalliert sind. Mit den folgenden Befehlen installieren Sie sie, wenn sie nicht vorhanden sind:

sudo apt install openssh-client

sudo apt install openssh-server

Als Nächstes verwenden Sie das gleiche PowerShell-Modul und den gleichen Befehl wie unter Windows, um Remoting-Tools zu installieren, das cmdlet Enable-SSHRemoting auszuführen und sshd, den SSH-Dienst, neu zu starten:

Install-Module Microsoft.PowerShell.RemotingTools

Enable-SSHRemoting

service sshd restart

So führen Sie PowerShell-Remoting über SSH aus

Um die interaktive Sitzung mit einem Remotecomputer zu starten, verwenden Sie ähnlich wie beim traditionellen PowerShell-Remoting mit WinRMden Befehl Enter-PSSession. Verwenden Sie den Parameter -HostName anstelle des Parameters -ComputerName, um die Verbindung über SSH statt über WinRM herzustellen. Um zum Beispiel eine Verbindung zu einem Computer über SSH herzustellen, passen Sie den folgenden Befehl an ihre Umgebung an:

Enter-PSSession -HostName 10.0.0.10 -UserName User

Das ist das Äquivalent des folgenden Linux-Befehls:

ssh [email protected]

Der Unterschied besteht darin, dass bei Verwendung des PowerShell-Befehls Enter-PSSession der PowerShell-Endpunkt verwendet wird.

Mit dem Befehl exit beenden Sie die Sitzung.

PowerShell-Remoting über SSH erfordert keine benannten Endpunkte wie WinRM. Stattdessen können Sie eine IP-Adresse verwenden.

Sofern Sie die Voraussetzungen erfüllt haben, funktioniert Enter-PSSession von Windows oder Linux zu einem Windows- oder Linux-Computer.

So führen Sie Skripts mit einer PowerShell-Remoting-Sitzung aus

Enter-PSSession eignet sich hervorragend für die interaktive Verwendung, aber das Ausführen eines Skripts per Fernzugriff erfordert einen anderen Ansatz. Um ein Sitzungsobjekt zu erstellen und dann Befehle mit dem Cmdlet Invoke-Command auszuführen, verwenden Sie New-PSSession. Mit dem Befehl New-PSSession wird eine dauerhafte Sitzung mit dem Remotecomputer gestartet, während Invoke-Command die Ausführung von Befehlen auf lokalen und Remotecomputern ermöglicht.

Zunächst generieren und konfigurieren Sie die SSH-Schlüssel, die zur Übergabe eines Kennworts an die Cmdlets *-PSSession erforderlich sind. Die Erstellung von SSH-Schlüsseln für PowerShell ist die gleiche wie die für typische SSH-Aktivitäten, aber das Verfahren zum Einrichten von SSH-Schlüsseln liegt außerhalb des Rahmens dieses Artikels.

Nachdem Sie die SSH-Schlüssel erstellt haben, erstellen Sie ein PowerShell-Sitzungsobjekt:

$session = New-PSSession -HostName 10.0.0.10 -UserName User

Jetzt führen Sie Befehle in dieser Sitzung über Invoke-Command aus. Der folgende Code listet alle laufenden Prozesse auf dem entfernten Rechner auf.

Invoke-Command -Session $session -ScriptBlock {Get-Process}

Cmdlet Invoke-Command
Abbildung 3: Verwenden Sie das Cmdlet Invoke-Command, um die auf dem Remotecomputer ausgeführten Prozesse anzuzeigen.

Wenn Sie fertig sind, entfernen Sie die Sitzung mit dem folgenden Befehl:

Remove-PSSession $session

Wie führe ich erweiterte PowerShell-Remoting-Verfahren durch?

Die Verwendung von Sitzungen eröffnet eine Vielzahl von Optionen für die Skripterstellung und die Remoteverwaltung. Der folgende Code findet zum Beispiel alle Computer, auf denen PowerShell derzeit ausgeführt wird:

$processes = $arrayOfComputers | ForEach-Object -ThrottleLimit 10 -Parallel {

    $session = New-PSSession -HostName $_ -UserName user

    Invoke-Command -Session $session -ScriptBlock {Get-Process}

    Remove-PSSession $session

}

$processes | Where-Object {$_.ProcessName -eq 'pwsh'} | Select-Object -ExpandProperty PSComputerName | Select-Object -Unique

Das Skript enthält keine Betriebssystemprüfungen, da Get-Process unter Windows und Linux gleich funktioniert.

In diesem Beispielskript finden Sie alle Computer mit einem bestimmten Dateipfad:

$fileExists = $arrayOfComputers | ForEach-Object -ThrottleLimit 10 -Parallel {

    $session = New-PSSession -HostName $_ -UserName user

    [pscustomobject]@{

        Computer = $_

        FileExists = Invoke-Command -Session $session -ScriptBlock {Test-Path '/path/to/test.txt'}

    }

    Remove-PSSession $session

}

$fileExists | Where-Object {$_.FileExists}

So beheben Sie Probleme mit PowerShell-Remoting über SSH

Wenn Sie nach dem Überprüfen der Voraussetzungen keine Verbindung zu einem Remotegerät über SSH herstellen können, verwenden Sie PowerShell zur Fehlerbehebung.

Zunächst überprüfen Sie, ob Sie den sshd-Dienst mit diesem Befehl neu gestartet haben:

Restart-Service sshd

Als nächstes testen Sie die SSH-Konnektivität:

Test-NetConnection -ComputerName 10.0.0.10 -Port 22

Abschließend testen Sie, ob SSH funktioniert, indem Sie SSH ohne PowerShell verwenden.

ssh [email protected]

Warum Sie SSH-Remoting mit PowerShell in Betracht ziehen sollten

Auch wenn das WinRM-basierte PowerShell-Remoting die empfohlene Methode für die Windows-Geräteverwaltung ist, können Sie die Möglichkeiten sehen, die sich mit SSH-Remoting eröffnen. Solange Sie keine Remote-Endpunktkonfiguration oder JEA benötigen, funktioniert SSH in den meisten Szenarien. Wenn Sie ein konsistentes Remoting-Erlebnis unter Windows und Linux wünschen, -dann empfiehlt es sich, SSH zu verwenden.

Erfahren Sie mehr über Serverbetriebssysteme