Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Überblick
In der Regel wird beim PowerShell-Remoting für die Aushandlung der Verbindung und den Datentransport WinRM verwendet. SSH ist jetzt für Linux- und Windows-Plattformen verfügbar und ermöglicht echtes PowerShell-Remoting für mehrere Plattformen.
WinRM bietet ein stabiles Hostingmodell für PowerShell-Remotesitzungen. SSH-basiertes Remoting unterstützt derzeit nicht die Remotekonfiguration von Endpunkten und JEA (Just Enough Administration, minimale Verwaltung).
Mit SSH-Remoting können Sie einfache PowerShell-Sitzungsremoting zwischen Windows- und Linux-Computern durchführen. SSH-Remoting erstellt einen PowerShell-Hostprozess als SSH-Subsystem auf dem Zielcomputer. Schließlich implementieren wir ein allgemeines Hostingmodell, ähnlich wie WinRM, zur Unterstützung der Endpunktkonfiguration und JEA.
Die Cmdlets New-PSSession
, Enter-PSSession
und Invoke-Command
verfügen jetzt über einen neuen Parametersatz, um diese neue Remotingverbindung zu unterstützen.
[-HostName <string>] [-UserName <string>] [-KeyFilePath <string>]
Zum Erstellen einer Remotesitzung geben Sie den Zielcomputer mit dem Parameter "HostName " an und geben den Benutzernamen mit "UserName" an. Wenn Sie die Cmdlets interaktiv ausführen, werden Sie aufgefordert, ein Kennwort einzugeben. Sie können auch die SSH-Schlüsselauthentifizierung mit einer privaten Schlüsseldatei mit dem KeyFilePath-Parameter verwenden. Das Erstellen von Schlüsseln für die SSH-Authentifizierung variiert je nach Plattform.
Allgemeine Einrichtungsinformationen
PowerShell 6 oder höher und SSH muss auf allen Computern installiert sein. Installieren Sie sowohl den SSH-Client (ssh.exe
) als auch den Server (sshd.exe
), damit Sie remote zu und von den Computern wechseln können. OpenSSH für Windows ist jetzt in Windows 10 Build 1809 und Windows Server 2019 verfügbar. Weitere Informationen finden Sie unter Verwalten von Windows mit OpenSSH. Installieren Sie für Linux SSH, einschließlich sshd-Server, das für Ihre Plattform geeignet ist. Außerdem müssen Sie PowerShell von GitHub installieren, um das SSH-Remoting-Feature zu erhalten.
Der SSH-Server muss so konfiguriert sein, dass ein SSH-Subsystem zum Hosten eines PowerShell-Prozesses auf dem Remotecomputer erstellt wird. Außerdem müssen Sie die Kennwort - oder schlüsselbasierte Authentifizierung aktivieren.
Installieren des SSH-Diensts auf einem Windows-Computer
Installieren Sie die neueste Version von PowerShell. Weitere Informationen finden Sie unter Installieren von PowerShell unter Windows.
Sie können bestätigen, dass PowerShell über SSH-Remotingunterstützung verfügt, indem Sie die
New-PSSession
Parametersätze auflisten. Sie werden feststellen, dass Parametersatznamen vorhanden sind, die mit SSH beginnen. Diese Parametersätze enthalten SSH-Parameter .(Get-Command New-PSSession).ParameterSets.Name
Name ---- SSHHost SSHHostHashParam
Installieren Sie das neueste Win32 OpenSSH. Installationsanweisungen finden Sie unter "Erste Schritte mit OpenSSH".
Hinweis
Wenn Sie PowerShell als Standardshell für OpenSSH festlegen möchten, lesen Sie "Konfigurieren von Windows für OpenSSH".
Bearbeiten Sie die
sshd_config
Datei unter$Env:ProgramData\ssh
.Stellen Sie sicher, dass die Kennwortauthentifizierung aktiviert ist:
PasswordAuthentication yes
Erstellen Sie das SSH-Subsystem, das einen PowerShell-Prozess auf dem Remotecomputer hosten soll:
Subsystem powershell C:/progra~1/powershell/7/pwsh.exe -sshs
Hinweis
In OpenSSH für Windows gibt es einen Fehler, der verhindert, dass Sie einen Pfad mit Leerzeichen für die ausführbare Datei des Subsystems verwenden. Es gibt zwei Wege, dieses Problem zu umgehen:
- Verwenden des Kurznamens im Windows 8.3-Stil für den ausführbaren PowerShell-Pfad
- Erstellen einer symbolischen Verknüpfung mit der ausführbaren PowerShell-Datei, die zu einem Pfad ohne Leerzeichen führt
Weitere Informationen finden Sie unter Problem Nr. 784 im PowerShell/Win32-OpenSSH-Repository.
Sie müssen nur den Namen der 8.3-Formatvorlage für das Segment des Pfads abrufen, der das Leerzeichen enthält. PowerShell 7 ist standardmäßig in
C:\Program Files\PowerShell\7\
. Der NameProgram Files
der 8.3-Formatvorlage sollte seinprogra~1
. Sie können den folgenden Befehl verwenden, um den Namen zu überprüfen:Get-CimInstance Win32_Directory -Filter 'Name="C:\\Program Files"' | Select-Object EightDotThreeFileName
Der Name 8.3 ist ein Legacyfeature des NTFS-Dateisystems, das deaktiviert werden kann. Dieses Feature muss für das Volume aktiviert sein, auf dem PowerShell installiert ist.
Alternativ können Sie eine symbolische Verknüpfung mit der ausführbaren PowerShell-Datei erstellen, die zu einem Pfad ohne Leerzeichen führt. Diese Methode wird bevorzugt, da Sie den Link aktualisieren können, wenn sich der Pfad zur ausführbaren PowerShell-Datei ändert, ohne die Datei auch aktualisieren
sshd_config
zu müssen.Verwenden Sie den folgenden Befehl, um eine symbolische Verknüpfung mit der ausführbaren Datei zu erstellen:
$newItemSplat = @{ ItemType = 'SymbolicLink' Path = 'C:\ProgramData\ssh\' Name = 'pwsh.exe' Value = (Get-Command pwsh.exe).Source } New-Item @newItemSplat
Dieser Befehl erstellt die symbolische Verknüpfung im selben Verzeichnis, das vom OpenSSH-Server verwendet wird, um die Hostschlüssel und andere Konfiguration zu speichern.
Optional können Sie die Schlüsselauthentifizierung aktivieren:
PubkeyAuthentication yes
Weitere Informationen finden Sie unter Verwalten von OpenSSH-Schlüsseln.
Starten Sie den sshd-Dienst neu.
Restart-Service sshd
Fügen Sie den Pfad hinzu, in dem OpenSSH zu Ihrer PATH-Umgebungsvariable installiert ist. Beispiel:
C:\Program Files\OpenSSH\
. Dieser Eintrag ermöglicht das Auffinden vonssh.exe
.
Installieren des SSH-Diensts auf einem Ubuntu Linux-Computer
Installieren Sie die neueste Version von PowerShell, siehe Installieren von PowerShell auf Ubuntu.
Installieren Sie Ubuntu OpenSSH Server.
sudo apt install openssh-client sudo apt install openssh-server
Bearbeiten Sie die
sshd_config
Datei am Speicherort/etc/ssh
.Stellen Sie sicher, dass die Kennwortauthentifizierung aktiviert ist:
PasswordAuthentication yes
Optional können Sie die Schlüsselauthentifizierung aktivieren:
PubkeyAuthentication yes
Weitere Informationen zum Erstellen von SSH-Schlüsseln auf Ubuntu finden Sie auf der Manpage für ssh-keygen.
Hinzufügen eines PowerShell-Subsystemeintrags:
Subsystem powershell /usr/bin/pwsh -sshs -NoLogo
Hinweis
Der Standardspeicherort der ausführbaren PowerShell-Datei ist
/usr/bin/pwsh
. Der Speicherort kann je nach Installation von PowerShell variieren.
Starten Sie den SSH-Dienst neu.
sudo systemctl restart sshd.service
Installieren des SSH-Diensts auf einem macOS-Computer
Installieren Sie die neueste Version von PowerShell. Weitere Informationen zum Installieren von PowerShell unter macOS.
Stellen Sie sicher, dass SSH-Remoting aktiviert ist, indem Sie die folgenden Schritte ausführen:
- Öffnen Sie
System Settings
. - Klicken Sie auf
General
. - Klicken Sie auf
Sharing
. - Überprüfen Sie
Remote Login
, umRemote Login: On
festzulegen. - Zugriff auf die entsprechenden Benutzer zulassen.
- Öffnen Sie
Bearbeiten Sie die
sshd_config
Datei am Speicherort/private/etc/ssh/sshd_config
.Verwenden Sie einen Text-Editor wie Nano:
sudo nano /private/etc/ssh/sshd_config
Stellen Sie sicher, dass die Kennwortauthentifizierung aktiviert ist:
PasswordAuthentication yes
Hinzufügen eines PowerShell-Subsystemeintrags:
Subsystem powershell /usr/local/bin/pwsh -sshs -NoLogo
Hinweis
Der Standardspeicherort der ausführbaren PowerShell-Datei ist
/usr/local/bin/pwsh
. Der Speicherort kann je nach Installation von PowerShell variieren.Optional können Sie die Schlüsselauthentifizierung aktivieren:
PubkeyAuthentication yes
Starten Sie den sshd-Dienst neu.
sudo launchctl stop com.openssh.sshd sudo launchctl start com.openssh.sshd
Hinweis
Wenn Sie ihr Betriebssystem aktualisieren, wird die SSH-Konfigurationsdatei möglicherweise überschrieben. Vergewissern Sie sich, dass Sie die Konfigurationsdatei nach einem Upgrade überprüfen.
Authentifizierung
PowerShell-Remoting über SSH basiert auf dem Authentifizierungsaustausch zwischen dem SSH-Client und dem SSH-Dienst und implementiert keine Authentifizierungsschemas selbst. Das Ergebnis ist, dass alle konfigurierten Authentifizierungsschemas, einschließlich der mehrstufigen Authentifizierung, von SSH und unabhängig von PowerShell behandelt werden. Sie können z. B. den SSH-Dienst so konfigurieren, dass eine Authentifizierung mit öffentlichem Schlüssel und ein einmaliges Kennwort für die zusätzliche Sicherheit erforderlich ist. Die Konfiguration der mehrstufigen Authentifizierung liegt außerhalb des Umfangs dieser Dokumentation. In der Dokumentation zu SSH finden Sie Informationen zum ordnungsgemäßen Konfigurieren der mehrstufigen Authentifizierung und zur Überprüfung der Funktion außerhalb von PowerShell, bevor Sie versuchen, sie mit PowerShell-Remoting zu verwenden.
Hinweis
Benutzer behalten dieselben Berechtigungen in Remotesitzungen bei. Dies bedeutet, dass Administratoren Zugriff auf eine Shell mit erhöhten Rechten haben und normale Benutzer nicht.
Beispiel für PowerShell-Remoting
Die einfachste Möglichkeit zum Testen von Remoting besteht darin, es auf einem einzelnen Computer auszuprobieren. In diesem Beispiel erstellen wir eine Remotesitzung zurück auf denselben Linux-Computer. Wir verwenden PowerShell-Cmdlets interaktiv, sodass SSH-Prompts angezeigt werden und um Bestätigung des Hostcomputers sowie Eingabe eines Kennworts bitten. Sie können auf einem Windows-Computer dasselbe tun, um sicherzustellen, dass Remoting funktioniert. Verbinden Sie sich dann remote zwischen Computern, indem Sie den Hostnamen ändern.
Linux zu 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 zu 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 zu 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>
Einschränkungen
Der Befehl "sudo " funktioniert nicht in einer Remotesitzung auf einem Linux-Computer.
PSRemoting über SSH unterstützt keine Profile und hat keinen Zugriff auf
$PROFILE
. Einmal in einer Sitzung können Sie ein Profil laden, indem Sie das Profil mit dem vollständigen Dateipfad beschaffen. Dies bezieht sich nicht auf SSH-Profile. Sie können den SSH-Server so konfigurieren, dass PowerShell als Standardshell verwendet und ein Profil über SSH geladen wird. Weitere Informationen finden Sie in der SSH-Dokumentation.Vor PowerShell 7.1 unterstützt Remoting über SSH keine Remotesitzungen für den zweiten Hop. Diese Funktion war auf Sitzungen mit WinRM beschränkt. PowerShell 7.1 ermöglicht, dass
Enter-PSSession
undEnter-PSHostProcess
in jeder interaktiven Remotesitzung funktionieren.