Microsofts Powershell für Linux: Microsoft hat Probleme beim Freimachen

Auf wirklich gar nichts ist mehr Verlass: Ein Feindbild war innerhalb der Open-Source-Community über Jahrzehnte hinweg immer mehrheitstauglich: Microsoft. Und der Konzern aus Redmond tat das Seinige, um den Disput anzuheizen: Unvergessen etwa die Werbekampagne, bei der Microsoft Pinguinen kurzerhand die mutierten Köpfe anderer Tiere verpasste - etwa den eines Frosches mit Geweih - und dazu anmerkte, ein offenes Betriebssystem habe nicht nur Vorteile. Legendär ist auch die Aussage(öffnet im neuen Fenster) des zuweilen impulsiven Microsoft-Ex-CEOs Steve Ballmer, Linux sei ein "Krebsgeschwür" .
Seit ein paar Jahren allerdings verfolgt Microsoft einen anderen Weg und betreibt dabei eine Annäherungspolitik. Mal machte der Konzern eher schwammige Aussagen hinsichtlich der Möglichkeit , Windows unter eine offene Lizenz zu stellen und dessen Quelltext verfügbar zu machen, mal verdutzte Microsoft die Community, als es ankündigte, für die eigene Cloud ein eigenes Linux(öffnet im neuen Fenster) zu entwickeln.
Und plötzlich kursieren sogar Fotos von Linux-Erfinder Torvalds(öffnet im neuen Fenster) , der auf der Linuxcon 2016 am Microsoft-Stand steht und dort gemütlich Kaffee trinkt. Noch im Jahr 2000 machte sich Torvalds einen Aprilscherz daraus, Microsoft zum Partner in Sachen Linux-Entwicklung zu ernennen. Nun hat die Wirklichkeit diesen Witz überholt.
.jpg)
Dass Microsoft es mit seinen Open-Source-Ambitionen ernst meint, machte das Unternehmen im August dann ein weiteres Mal deutlich, als es die Powershell für Windows unter eine freie Lizenz stellte und sie gewissermaßen im Vorübergehen auch gleich noch auf Linux und MacOS portierte .
Fast zehn Jahre Entwicklung der Powershell
Die Powershell hat auf Windows bereits eine bewegte Geschichte hinter sich: Erstmals 2007 stellte Microsoft das Werkzeug in Version 1.0 vor. Die Idee der Powershell ist, eine Alternative zur Kommandozeile cmd.exe zu schaffen, die auf Windows-Systemen bis heute enthalten ist, allerdings nicht viele Funktionen bietet. Verglichen mit typischen Linux-Shells hat cmd.exe keine Chance. Zum Beispiel steht in Sachen Scripting lediglich das Batch-Format zur Verfügung, damit kämpft das Tool auf verlorenem Posten.
Es sei aus Gründen der Fairness aber auch erwähnt, dass Microsoft cmd.exe eher als Relikt der Vergangenheit betrachtet denn als aktuelles Tool für Admins. Um dagegen ein Werkzeug für die Power-User zu liefern, führte der Konzern die Powershell ein. Im Laufe der Jahre sammelte sie viele Fans und durchaus auch Prestige. Wer regelmäßig mit Windows zu tun hat, schätzt ihre Möglichkeiten.
Dazu gehört das Ausführen von Befehlen auf Systemen ohne den Umweg über ein GUI. Fast jeder hat vermutlich schon jene Internet-Memes gesehen, die erklären, wie sich auf verschiedenen Betriebssystemen eine IP-Adresse einer Netzwerkkarte zuweisen lässt. Windows schneidet dort schlecht ab, weil der Vorgang mit cmd.exe kaum sinnvoll durchführbar ist. Die Powershell rüstet für Windows im Grunde jene Funktionalität nach, die Linux-Admins über die diversen Shells wie Bash, Ksh, Zsh und ihre Werkzeuge von Anfang an hatten.
Da stellt sich die Frage, warum Microsoft nun glaubt, mit der Windows-Powershell den Linux-Nutzern Mehrwert zu bieten? Was steckt hinter der Veröffentlichung der Powershell für Linux? Handelt es sich um einen Marketinggag von Microsoft oder besitzt die Powershell auf Linux im Alltag tatsächlich Funktionen, die existierende Linux-Shells nicht bieten?
Was soll das eigentlich?
Ausschlaggebend für Microsofts Open-Source-Bemühungen dürfte der Umstand sein, dass das Unternehmen sein .Net-Framework stärker propagieren möchte, um es zur bevorzugten Plattform von Entwicklern auf verschiedenen Betriebssystemen zu machen, darunter offenbar auch Linux und MacOS. Am Anfang der Powershell-Entwicklung für Linux stand folglich die Schaffung einer .Net-Kernplattform. Auf Basis eben jener war die Portierung der Powershell dann eine vergleichsweise einfache Übung.
Microsoft schielt aber auch in Richtung Cloud. Die Kombination aus den Werkzeugen Powershell, DSC und der Operations Management Suite bietet unter Linux die Möglichkeit, eigene Instanzen in Microsofts Public Cloud Azure bequem zu administrieren. Plattform und Administrationssoftware sind in dieser Kombination eng verzahnt.
Grundlegende Funktionen der Powershell
Unter der Haube basiert die Powershell auf .Net und mischt verschiedene Methoden. Einerseits ermöglicht sie das Ausführen simpler Kommandozeilenbefehle, ganz so, wie Admins es auch von Linux her kennen. Verschiedene Befehle lassen sich außerdem kombinieren, so dass typische Shellskripte entstehen. Zentrale Shell-Funktionen unter Linux beherrscht die Powershell ebenso, etwa die Möglichkeit, per Pipe die Ausgabe eines Programms an ein anderes umzuleiten. Andererseits folgt die Powershell dem objektorientierten Ansatz. Bei der Arbeit mit der Shell lassen sich Methoden sowie Objekte definieren, die die Methoden anschließend nutzen.
Zentral bei der Arbeit mit der Powershell sind die sogenannten Commandlets. Im Powershell-Sprech ist ein Cmdlet eine eigene .Net-Klasse, die eine festgelegte Aufgabe nach ihrem Aufruf ausführt. Cmdlets sind also im Grunde die eigentlichen Befehle, die sich in Form von Skripten oder sogar von Binaries bündeln lassen. Microsoft hat viel Arbeit investiert, um die Powershell mit vielen nützlichen Cmdlets auszustatten. Schon nach der Installation stehen viele Befehle bereit, etwa um Dateien oder Verzeichnisse zu löschen oder Ordner anzulegen oder deren Inhalt anzuzeigen.





Fast sinnvoller als unter Linux ist bei Cmdlets die Benennung gelöst. Laut Powershell-Standard müssen Cmdlets nämlich einen eindeutigen Namen haben, der aus einem Verb und einem Objekt besteht. Das Cmdlet für das Löschen von Ordnern oder Dateien heißt folgerichtig offiziell "Remove-Item". Ein anderes Beispiel: Das Cmdlet für Downloads aus dem Internet heißt "Invoke-WebRequest", wer Linux gewohnt ist, würde hier instinktiv aber eher nach den Befehlen wget oder curl suchen.
Um gestandenen Linux-Admins den Umstieg auf die Powershell leichter zu machen, hat sich Microsoft in deren ersten öffentlichen Versionen übrigens etwas Besonderes ausgedacht. Dort waren nämlich die gängigen Linux-Befehle den Powershell-Cmdlets mit der entsprechenden Konfiguration per Alias zugewiesen. Nach Beschwerden der Nutzer hat Microsoft diesen Ansatz allerdings wieder verworfen, denn er verhindert letztlich, dass Nutzer die echten Kommandozeilenprogramme - also etwa ls oder cd - ausführen.
Problemlose Installation unter Installation auf Linux
Microsoft ist erkennbar darum bemüht, die Einstiegshürden für die Powershell auf Linux möglichst gering zu halten. Das Unternehmen macht auf Github nicht nur den Quelltext der Version 6 der Powershell für die Öffentlichkeit verfügbar, sondern bietet auch Pakete für die gängigen Linux-Distributionen(öffnet im neuen Fenster) an. So ist es sehr leicht, gleich loszulegen - etwa auf Ubuntu 16.04. Nach der Installation der Pakete libunwind8 sowie libicu55 lässt sich das Powershell-Paket mittels dpkg -i wie gewohnt installieren.





Noch toller wäre der Dienst freilich, käme die Powershell über ein richtiges Paketrepository mit signierten Releasedateien daher. Möglicherweise ist Microsoft dieser Aufwand aber noch zu groß - weil auch Pakete für diverse RPM-basierte Distributionen seitens des Anbieters bereitstehen, müsste Microsoft dies dann für mehrere Paketsysteme umsetzen. Auch ohne eigenes Repository gilt jedenfalls: gut gemacht! So manch anderes Softwareprojekt sollte sich hier wie Microsoft verhalten.
Abgespecktes .Net bringt Einschränkungen
In der Dokumentation der Powershell für Linux und MacOS weisen die Microsoft-Entwickler bereits explizit darauf hin, dass Windows-Admins auf Linux nicht alle gewohnten Powershell-Befehle finden. Das liegt auch daran, dass die Powershell für Linux nicht direkt auf dem großen .Net-Framework basiert, sondern auf einer abgespeckten neue Variante namens .Net Core.
Diesen Ansatz verfolgen die Microsoft-Entwickler aber nicht, weil sie zu faul wären, alle Powershell-Funktionen auf Linux zu portieren. Eine Portierung ist bei mehreren Funktionen einfach nicht sinnvoll. Exemplarisch erwähnt seien die Powershell-Funktionen, die sich auf die Windows-Oberfläche beziehen. Die gibt es auf Linux-Systemen oder MacOS-Computern eben nicht. Entsprechend fehlen in der Powershell für Linux diverse Cmdlets, die Windows-Admins aus ihrer gewohnten Umgebung kennen.
Die abgespeckte .Net-Version ist noch in anderer Hinsicht wichtig: Wer im Netz Cmdlets oder Skripte für die Powershell findet, der darf in der Regel erwarten, dass die Windows-Powershell sie korrekt umsetzt. Programmiertechnisch sind Cmdlets schließlich nur .Net-Klassen, die andere, allgemein verfügbare .Net-Klassen einbinden. Während der Powershell auf Windows-Rechnern das volle .Net-Framework zur Verfügung steht, fehlen auf Linux-Systemen möglicherweise Klassen, die externe Cmdlets erwarten. Im schlimmsten Fall lassen sich Cmdlets also auf Linux nicht ausführen, während sie auf Windows-Systemen ohne Probleme funktionieren.
Quelloffene Variante klassischer Windows-Funktionen
Eine weitere Komponente, auf die die Powershell im Hintergrund setzt und die auf Linux-Systemen fehlt, heißt Windows Management Instrumentation (WMI). Auf Windows-Systemem leistet WMI einen wichtigen Beitrag zur Rechnerverwaltung. Per WMI lassen sich Windows-Hosts automatisiert verwalten, etwa durch das Ausrollen von Code auf dem Zielsystem. WMI ist Microsofts Methode, das Prinzip des Web-Based Enterprise Management (WBEM) umzusetzen und eine Schnittstelle für das Common Information Model (CIM) nach Standards der DMTF(öffnet im neuen Fenster) zu implementieren.
Microsoft weist hier ausdrücklich darauf hin, dass beim Thema WMI die Open-Source-Eigenschaften der Powershell enden. Jene Powershell-Erweiterungen, die sich explizit auf WMI beziehen, gehören gerade nicht zum quelloffenen Teil der Powershell, die auch unter Linux zu benutzen ist.
WMI liegt aktuellen Versionen von Windows ab Werk bei - Linux-Systemen aber eben nicht. Microsoft verspricht zwar, für dieses Problem eine Lösung zu bieten, verweist aktuell aber auf DSC für Linux, das es bereits seit einer ganzen Weile gibt. Die Idee hinter DSC ist es, fehlende WMI-Funktionalität durch OMI zu kompensieren. OMI, also die Open Management Infrastructure(öffnet im neuen Fenster) , ist eine Alternative der Open Group zu WMI und steht als freier Download zur Verfügung. Genau diese Bibliothek nutzt Microsoft, um die Powershell auf Linux ähnliche Aufgaben ausführen zu lassen wie auf Windows per WMI.
Desired State Configuration als Analog zu Puppet
Die Komponente innerhalb der Powershell, die andere Rechner auf Basis einer vorgegebenen Konfiguration herrichtet, heißt DSC, was für Desired State Configuration steht. Eine kastrierte Version von DSC hatte Microsoft bereits 2015 für Linux veröffentlicht. Wer aus der Linux-Welt kommt, tut sich bei einem Vergleich mit Puppet noch am leichtesten. Wie Puppet setzt DSC in der Powershell bestimmte deklarativ formulierte Einstellungen entlang der Admin-Vorgaben auf dem Host um. Wie Puppet ist auch DSC idempotent, liefert also bei mehrfacher Ausführung dasselbe Ergebnis wie nach einem einfachen Lauf.
Interessant an DSC ist, dass es auch unter der Haube so ähnlich wie Puppet funktioniert. Die gewünschte Konfiguration gibt der Admin in Form eines Konfigurationsdokuments (MOF-Datei) an, um sie dann von seiner Powershell aus auf den Linux-Rechner per Push-Befehl zu übertragen. Die Powershell-Dokumentation zum Thema DSC zeigt auch ein konkretes Beispiel für das Anlegen einer Datei in dem Verzeichnis tmp auf dem Zielhost.
Allerdings hat das natürlich wenig Bezug zur Praxis: Während WMI auf Windows-Hosts an das System angepasst ist, wirkt der auf OMI basierende Ansatz für Linux und Mac OS aktuell noch einigermaßen nutzlos. Hier bleibt abzuwarten, ob Microsoft DSC für Linux zum echten Managementwerkzeug ausbauen will oder ob man das Feld letztlich doch den etablierten Lösungen wie Puppet & Co. überlässt.
Wie bereits erwähnt, ist die Powershell DSC für Linux streng genommen ein übler Hack. Die notwendigen Powershell-Befehle setzte Microsoft damals in Form von Python-Skripten um. Mit der Veröffentlichung der Powershell für Linux fällt diese Notwendigkeit eigentlich weg. In absehbarer Zeit dürfte Microsoft DSC auf Linux also bloß noch aus der echten Powershell heraus anbieten.
Noch keine Remote-Verwaltung, dafür Scripting
Fernab von DSC tut sich bei der Powershell in ihrer ersten Version für Linux allerdings wenig. Windows-Remote-Management(öffnet im neuen Fenster) -Funktionalität fehlt. Per Powershell ist es also nicht möglich, einem Rechner aus der Ferne Befehle zu senden - ein Äquivalent zur SSH-Funktionalität in Linux ist schlichtweg nicht vorhanden. Immerhin hat Microsoft dieses Problem erkannt und gelobt Besserung. Noch ist aber nicht absehbar, wie die Umsetzung dann konkret aussieht.
Vermutlich setzt Microsoft langfristig bei der Lösung auf etablierte Protokolle wie OpenSSH. Wann der von Microsoft gestartete OpenSSH-Port auf Windows offiziell zur Verfügung stehen wird, ist derzeit noch nicht absehbar. Insgesamt dürfte sich die Powershell aber in Zukunft immer mehr zu einem universalen Werkzeug entwickeln, das sich an Windows- wie an Linux-Systeme gleichermaßen richtet.
Scripting
Shellskripte sind schon bei Linux ein heißes Eisen. Die einen lieben die Möglichkeit, Befehle gebündelt in eine Datei zu packen und diese dann auszuführen. Andere sehen in Shellskripten ein Werkzeug des Teufels und argumentieren, dass jedes Shellskript, das länger als zehn Zeilen ist, eigentlich in einer typischen Skriptsprache wie Perl oder Python verfasst sein sollte. Wer zur Fraktion der Shellskript-Befürworter gehört, darf sich über die Powershell freuen. Auch hier gibt es die Möglichkeit, Befehle per Powershell-Skript auszuführen. Das Prinzip funktioniert wie bei typischen Linux-Shells. Wichtig ist, dass die jeweilige Skriptdatei auf .ps1 endet.
Darüber hinaus sind der Kreativität kaum Grenzen gesetzt. Wie in einem Bash-Skript auch lassen sich in Powershell-Skripten die aufzurufenden Cmdlets aneinanderreihen. Powershell-Skripte lassen sich ebenfalls mit Bedingungen ausstatten, so gibt es If , Elseif und Else .





Hinzu kommt die Möglichkeit, eigene Funktionen in Form von Modulen zu hinterlegen. Das Apache-Beispiel, das die Powershell-Entwickler in ihrem Github-Verzeichnis hinterlegen(öffnet im neuen Fenster) , erklärt das gut. In einer Datei, deren Name auf .psm1 endet, definiert der Admin mit dem Schlüsselwort Function Funktionen. Wie aus anderen Shells gewohnt, können Funktionen Parameter haben. Die Moduldefinition lädt das jeweilige Shellskript dann per Import-Module -Cmdlet - schon stehen die eigenen Definitionen innerhalb des Shellskripts zur Verfügung.





Eine Besonderheit gibt es allerdings beim Aufrufen von Skripten. Wer es als Linux-Admin gewohnt ist, den berühmten Shebang (#!) an den Anfang eines Shellskripts zu stellen, kann das auch in der Powershell tun. Allerdings sorgt das dafür, dass jedes Shellskript in einer eigenen Powershell-Umgebung läuft, die eigens für diesen Zweck startet. Der Austausch von Objekten mit der umgebenden Powershell ist dann unmöglich.
Noch keine gleichwertige Alternative
Außer Frage steht wohl, dass Microsofts Ambitionen durchaus groß sind - denn der Konzern hat beträchtliche Mittel investiert, um aus der Powershell überhaupt ein Open-Source-Produkt zu machen. Aktuell gelingt es Microsoft allerdings nicht, höhere Erwartungen als die an ein Proof-of-Concept zu erfüllen. Im Github-Verzeichnis seiner Powershell führt der Hersteller eine Liste der Probleme, die aktuell die Powershell unter Linux noch betreffen. Das ist zwar einerseits löblich, denn auf diese Weise lebt Microsoft den Gedanken der Offenheit weiter. Auf der anderen Seite liest sich jene Liste wie eine Meldung aus dem Gruselkabinett. Denn teils fundamentale Funktionen sind immer noch defekt.
Darunter etwa das Globbing. Von Linux-Shells her sind Admins es gewohnt, dass sie mit Wildcards ( * für viele Zeichen oder ? für ein Zeichen) mehrere Dateien auf der Kommandozeile dynamisch auswählen können. Das funktioniert auf der Powershell zwar auch - aber nur für Cmdlets. Wer stattdessen ein natives Linux-Binary von der Powershell aus aufruft und eine Wildcard übergibt, erhält eine Fehlermeldung, weil die Powershell das Wildcard-Zeichen nicht automatisch ersetzt. Indirekt spielt dieser Umstand auch in die eingangs beschriebene Alias-Diskussion hinein. Wenn die Aliase für die gängigen Unix-Befehle entfernt sind und die Powershell stattdessen die nativen Linux-Programme aufruft, ist etwa der Befehl ls * in einem Ordner aus diesem Grund unmöglich.





Das Aufrufen nativer Linux-Binaries auf der Powershell hat aber noch mehr unangenehme Nebeneffekte. Der Rückgabewert von Cmdlets ist stets ein Objekt. Die Powershell ist auf Objekte angewiesen, um Funktionen wie das Weiterleiten der Ausgabe eines Programms als Eingabe an andere Programme zu ermöglichen. Native Linux-Programme geben aber klassische Rückgabewerte aus und keine Objekte, so dass das Piping hier gar nicht erst funktioniert.
Mindestens so schwer wiegt, dass die Powershell ab Werk nicht zwischen Groß- und Kleinschreibung unterscheidet. Das betrifft vor allem fertige Powershell-Skripte aus dem Netz. Wer sich ein fertiges Skript für eine bestimmte Aufgabe herunterlädt, muss hoffen, dass dessen Autor etwa beim Laden externer Module genau den Namen benutzt, den das jeweilige Modul im Dateisystem hat. In einer Linux-Umgebung erhielte er sonst nur eine Fehlermeldung.
Das Thema Case-Sensitivity ist auch für Windows-Admins ein Problem, die über die Powershell zu Linux kommen. Beim Komplettieren der Eingabe mit der Tab-Taste etwa zeigt die Powershell unter Windows das passende Programm an, ganz gleich, ob Groß- und Kleinschreibung passen oder nicht. Wer auf Linux jedoch Mk eingibt und glaubt, das würde zu mkdir automatisch vervollständigt, der bekommt wieder nur eine Fehlermeldung.
Obendrein entwickeln sich aus liebgewonnenen Konventionen schnell Hindernisse, wenn Linux-Admins die Powershell nutzen - oder umgekehrt. Unter Windows ist es etwa möglich, über die Powershell Programme zu stoppen oder zu starten. Die passenden Befehle dafür funktionieren unter Linux freilich nicht, weil hier eigene (native) Kommandos existieren. Überhaupt müssen sich Admins umstellen, was die Notation von Befehlen angeht. Parameter bei Kommandos bekommen stets nur ein einziges - vorangestellt und sind außerdem Case-sensitive.
Wer sich von diesen Kinderkrankheiten nicht abschrecken lässt und erste Versuche mit der Powershell unternimmt, bekommt von Microsoft sehr großzügige Hilfe. Zusammen mit der Powershell für Linux stellte das Unternehmen auch fertige Beispiele für neue Cmdlets bereit und demonstriert nebenbei, wie sich Skriptsprachen - etwa Python - aus der Powershell heraus sinnvoll nutzen lassen.
Fazit
Im ersten Test erweist sich die Powershell noch als Baustelle, die altgediente Bash-Admins kaum zufriedenstellt. Angesichts der Tatsache, dass Microsoft das Werkzeug immer noch als Alphaversion betitelt und öffentliche Entwicklung (samt Bug-Suche) erst seit zwei Monaten überhaupt stattfindet, ist das aber okay. Zumal Microsoft die gesamte Entwicklung inklusive des Bug-Reportings genauso offen gestaltet wie den Quelltext der Powershell selbst. Auch das ist bei Microsoft früher bei anderen Gelegenheiten anders abgelaufen.
Viel wichtiger ist zumindest im Augenblick ohnehin das erneute Zeichen aus Richtung Microsoft, dass man in Linux nicht mehr den einstigen Erzfeind sieht, sondern einen Konkurrenten und sogar einen echten Partner für mögliche Kooperationen. Als sich der Microsoft-CEO und Ballmer-Nachfolger Satya Nadella vor einigen Monaten zusammen mit einer Powerpoint-Folie ablichten ließ, deren Text "Microsoft Loves Linux" lautete, sorgte das in der Szene für einige Belustigung. Die Veröffentlichung der Powershell für Linux und die Arbeit, die Microsoft seither in dieses und andere Produkte investiert, beweisen aber, dass das keineswegs nur eine leere Floskel war.
Klar ist auch: Die Powershell für Linux steht momentan gerade erst am Anfang ihrer Entwicklung. Behält Microsoft das aktuelle Tempo bei der Entwicklung bei, dann kann sie in absehbarer Zeit durchaus zum ernsthaften Konkurrenten für etablierte Linux-Shells werden. Und damit auch zum Segen für alle Admins, die eigentlich aus der Windows-Welt stammen, aber mit Linux aus irgendwelchen Gründen trotzdem regelmäßig in Berührung kommen. Zusammen mit dem Ansatz, die Bash auf Windows zu portieren, verschmelzen die Welten also zusehends miteinander.
Über den Autor: Martin Gerhard Loschwitz ist Team Lead Openstack bei dem Hoster Syseleven in Berlin, der unter anderem auch Golem.de hostet. Er beschäftigt sich dort bevorzugt mit den Themen Distributed Storage, Software Defined Networking und Openstack.



