PowerShell Core Remoting mit Ubuntu und Windows
Mit PowerShell Core greift Microsoft um sich. Das hat zum Einen damit zu tun, dass die PowerShell Core als Open Source Projekt auf GitHub gehostet und gepflegt wird. Zum Anderen läuft die Version 6 der PowerShell neben Windows auch auf Linux und MacOS.
Das Ziel ist klar definiert.
Die PowerShell bringt eine Funktion schon sehr lange mit und in Windows 2012 wurde es zum Standard. PowerShell Remoting. Das Verbinden auf einen anderen Server. Mit der PowerShell wird dies nun auch Betriebsystem übergreifen möglich!
Realisiert wird dies durch den Ersatz von WSMan/WinRM als Basis durch SSH. Die technischen Details werden in diesem Ignite Vortrag besprochen.
https://youtu.be/oOiwcN6DAwQ?t=2978
Umgebung
Meine Umgebung besteht aus folgenden Komponenten
- Windows 10 (10.0.16299.0)
- Ubuntu Server 16.04.3 mit konfiguriertem OpenSSH
Vorbereitungen
Ubuntu
PowerShell Core
PowerShell Core kann direkt aus dem Microsoft Repository installiert werden.
# curl installieren
sudo apt-get install curl
# Das Microsoft repo samt Schlüssel hinzufügen
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list | sudo tee /etc/apt/sources.list.d/microsoft.list
# Die Paketliste aktualisieren
sudo apt-get update
# PowerShell Core installieren
sudo apt-get install -y powershell
sshd
Nun muss die sshd_config noch vorbereitet werden um die PowerShell nativ anzusprechen. In der Datei /etc/sshd/ssd_config müssen folgende Optionen eingestellt werden.
# Password und Key Authentifizierung aktivieren PasswordAuthentication yes PubkeyAuthentication yes
PowerShell Core als Subsystem registrieren
Subsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile
Anschließend muss nur noch der sshd Service neu gestartet werden.
sudo service sshd restart
Windows
PowerShell Core
Für die Nutzung von PSRemoting über SSH muss unbedingt eine aktuelle Version der PowerShell Core installiert werden. Die normale PowerShell auf Windows 10 unterstützt nicht alle notwendigen Funktionen. Die Aktuellste kann von der PowerShell GitHub Seite als msi oder zip geladen werden. In diesem Artikel habe ich die msi installiert.
[caption id=“attachment_241” align=“alignnone” width=“300”] Powershell Core 6.0.0-beta.9[/caption]
OpenSSH
Anschließend muss OpenSSH for Windows installiert werden.
Dazu lade ich die zip Datei herunter und entpacke Sie in einem Ordner in meinem Profil. Diesen füge ich an die ‘Path’ Variable an.
cd ~
mkdir sshd
# Download von OpenSSH for Windows
Invoke-WebRequest https://github.com/PowerShell/Win32-OpenSSH/releases/download/v0.0.22.0/OpenSSH-Win64.zip -OutFile "$PWD\sshd\OpenSSH-Win64.zip"
# Entpacken der Daten
[System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem") | Out-Null
[System.IO.Compression.ZipFile]::ExtractToDirectory("$PWD\sshd\OpenSSH-Win64.zip","$PWD\sshd")
dir .\sshd\OpenSSH-Win64\
# Anpassen der 'Path' Variable
$env:Path="$PWD\sshd\OpenSSH-Win64\;"+$env:Path
Enter-PSSession
Hier ist der “große” Unterschied zwischen einer Verbindung über WinRM. Es wird nicht -ComputerName
sondern -Hostname
verwendet! Das wird sich laut Microsoft sicherlich ändern, ist in der aktuellen Version aber notwendig.
PS > Enter-PSSession -HostName ubuntupwsh.dev.toolsection.info -UserName fabian