Mit PowerShell Core unter Linux loslegen
In unserem Tipp zu PowerShell Core zeigen wir ihnen die Grundlagen zu der Open-Source-Variante, die Sie im Data Center auf Servern mit Windows, Linux und macOS einsetzen können.
PowerShell ist eine Skriptsprache für Windows, um damit Systeme wie Active Directory, Exchange und Share Point zu verwalten. 2016 hat sich Microsoft entschieden, eine Open-Source-Version der PowerShell zu veröffentlichen, die sich PowerShell Core nennt.
PowerShell Core für Linux ist ein Kommandozeilen-Tool, mit dem sich Binärdateien erstellen und Objekt-Piping umsetzen lassen. Ebenfalls können Sie Sollzustandskonfigurationen für zuverlässiges Konfigurationsmanagement realisieren. Die wirklichen Vorteile sind allerdings Einfachheit und gute Lesbarkeit. PowerShell Core verhält sich anders als zum Beispiel Bash. Sie sollten lernen, damit umzugehen, auch wenn Sie Bash kennen und können.
PowerShell Core ermöglicht Data-Center-Standardisierung und Optionen für Automation, weil es zu Windows, Linux und macOS kompatibel ist. Das gilt vor allen Dingen, wenn Sie regelmäßig Skripte für die Verwaltung implementieren wollen. Es hilft außerdem, wenn Sie ein objektorientiertes .NET Framework brauchen.
Mit PowerShell Core können Sie Teile des Data Centers über Server hinaus verwalten. VMware, NetApp und Cisco bieten Module für PowerShell Core. Damit wird PowerShell Core zum Bindeglied zwischen all den verschiedenen Programmen, um Virtualisierung und Netzwerkaktivitäten im Data Center zu automatisieren.
Sie können mit PowerShell Core eine virtuelle Maschine (VM) in VMware vSphere erstellen, Cicso-Netzwerkgeräte sichern oder gemeinsam genutzte Netzlaufwerke in NetApp Fabric-Attached Storage erstellen. Da PowerShell Core nun verfügbar ist, können Sie die Linux-äquivalenten cmdlets erlernen.
PowerShell Core unter Linux installieren
Microsoft beschreibt mehrere Methoden, wie sich PowerShell Core auf verschiedenen Linux-Distributionen installieren lässt. In unserem Beispiel benutzen wir CentOS. Sie können aber auch Red Hat Enterprise Linux oder Ubuntu verwenden.
Überprüfen Sie zunächst, ob Sie das Repository von Microsoft einrichten müssen:
[root@linuxmachine ~]$ curl https://packages.microsoft.com/config/rhel/7/prod.repo | sudo tee /etc/yum.repos.d/microsoft.repo
Im Anschluss installieren Sie PowerShell Core mit yum:
[root@linuxmachine ~]$ sudo yum install -y PowerShell Core
Nun können Sie pwsh ausführen und bekommen damit Zugriff auf die Eingabeaufforderung von PowerShell Core:
[root@linuxmachine ~]$ pwsh
PowerShell Core 6.1.1
Copyright (c) Microsoft Corporation. All rights reserved.
https://aka.ms/pscore6-docs
Type 'help' to get help.
PS /home/vagrant>
Prozesse mit PowerShell Core betrachten
Der Befehl top ist eine häufige Methode, um Prozesse unter Linux zu betrachten. Bei PowerShell Core können Sie das cmdlet Get-Process nutzen. Per Standard zeigt es Name, ID, NPM (Nonpaged Memory), PM (Paged Memory), WS (Working Set) und SI (Session ID).
Nachfolgend sehen Sie den Prozess firewalld in PowerShell Core:
PS /home/vagrant> Get-Process -Name firewalld
NPM(K) PM(M) WS(M) CPU(s) Id SI ProcessName
------ ----- ----- ------ -- -- -----------
0 0.00 23.07 0.48 11231 231 firewalld
Um Prozesse anzuhalten, benutzt PowerShell Core den Befehl Stop-Process. Möchten Sie das Anhalten von Prozessen automatisieren, dürfen Sie den Output von Get-Process durch eine sogenannte Pipe an Stop-Process übermitteln. Bei dem VboxService auf einer VM Vagrant sieht das zum Beispiel so aus:
PS /home/vagrant> Get-Process -Name VBoxService | Stop-Process -WhatIf
What if: Performing the operation "Stop-Process" on target "VBoxService (754)".
Beachten Sie, dass das Beispiel den Parameter -WhatIf im Stop-Process verwendet. Der Zusatz testet ein cmdlet und zeigt, was theoretisch passiert, wenn Sie das cmdlet starten, aber führt es im Endeffekt nicht aus.
Mit Dateien arbeiten
Wollen Sie mit Dateien arbeiten, dann ist das PowerShell Core cmdlet Get-ChildItem dem ls von Linux am ähnlichsten. Sie bekommen damit an den Inhalt eines Ordners.
PS /home/vagrant/testfolder> Get-ChildItem
Directory: /home/vagrant/testfolder
Mode LastWriteTime Length Name
---- ------------- ------ ----
------ 1/13/19 5:10 PM 0 1.txt
------ 1/13/19 5:10 PM 0 2.txt
------ 1/13/19 5:10 PM 0 3.txt
------ 1/13/19 5:10 PM 0 4.txt
------ 1/13/19 5:10 PM 0 5.txt
Wollen Sie die Dateien in einem Ordner filtern, ist -Filter das cmdlet, das am häufigsten eingesetzt wird. Nachfolgend sehen Sie ein Beispiel, das Dateien zeigt, die .txt als Endung haben:
PS /home/vagrant/testfolder> Get-ChildItem -Filter *.txt
Directory: /home/vagrant/testfolder
Mode LastWriteTime Length Name
---- ------------- ------ ----
------ 1/13/19 5:10 PM 0 1.txt
------ 1/13/19 5:10 PM 0 2.txt
------ 1/13/19 5:10 PM 0 3.txt
------ 1/13/19 5:10 PM 0 4.txt
------ 1/13/19 5:10 PM 0 5.txt
Wollen Sie die Inhalte einer Datei ansehen oder ändern, dann benutzen Sie die Befehle Get-Content und Set-Content. Get-Content ähnelt cat unter Linux.
PS /home/vagrant/testfolder> Get-Content ./testfile.txt
Das ist eine Test-Zeichenkette.
Möchten Sie Teile der Datei ändern, können Sie den Operator Replace zusammen mit Get-Content einsetzen und das Ganze via Pipe an Set-Content schicken. Unser Beispiel ändert in der Datei testfile.txt Zeichenkette in Ding:
PS /home/vagrant/testfolder> (Get-Content ./testfile.txt).Replace('string','thing') | Set-Content ./testfile.txt
PS /home/vagrant/testfolder> Get-Content ./testfile.txt
Das ist eine Test-Ding.
Netzwerk-Ports testen
Unter Linux untersuchen Sie mit dem Befehl nc (netcat) Probleme bei entfernten Netzwerk-Ports auf anderen Hosts. Mit PowerShell Core unter Linux machen Sie das mit dem cmdlet Test-Connection. Sobald Sie Test-Connection ausführen, bekommen Sie einen Booleschen Datentyp, der aussagt, ob die Verbindung wahr oder falsch ist.
Der folgende Befehl testet, ob bei google.com der Port 80 offen ist (natürlich ist er das):
PS /root> Test-Connection -TargetName google.com -TCPPort 80
True
Mit test-connection können Sie auch einfach nur den Verbindungsstatus wie bei einem Ping herausfinden:
PS /root> Test-Connection -TargetName google.com
Pinging google.com [172.217.11.46] with 32 bytes of data:
Reply from 172.217.11.46: bytes=32 time=5ms TTL=128
Reply from 172.217.11.46: bytes=32 time=5ms TTL=128
Reply from 172.217.11.46: bytes=32 time=5ms TTL=128
Reply from 172.217.11.46: bytes=32 time=5ms TTL=128
Ping complete.
Um mehrere Hosts zu testen, dürfen Sie alle Hosts in ein Array packen, das von Test-Connection verarbeitet wird. Allerdings sehen Sie keinen Output für die speziellen Hosts:
PS /root> $Hosts = 'google.com','espn.com','cnn.com','blank.org'
PS /root> Test-Connection -TargetName $hosts -TCPPort 80
True
True
True
True
Um die Hosts in der Ausgabe zu zeigen, können Sie in PowerShell Core eine ForEach-Schleife benutzen und die $Hosts-Variable via Pipe durch Test-Connection schicken:
PS /root> $Hosts | ForEach-Object {$Output = Test-Connection -TargetName $_ -TCPPort 80;Write-Output "$_,$Output"}
google.com,True
espn.com,True
cnn.com,True
blank.org,True
Ein Skript schreiben
PowerShell-Core-Skripte benutzen die Erweiterung .ps1 und sie werden innerhalb oder außerhalb der Eingabeaufforderung von PowerShell Core genutzt. Sie können Skripte nach Bedarf manuell ausführen oder automatisieren, um Ihnen das Tagesgeschäft zu erleichtern.
Im Skript test.ps1 wird das cmdlet Get-ChildItem ausgeführt. Lassen Sie das Skript laufen, werden die Dateien und Ordner des Verzeichnisses zurückgeliefert, in dem Sie sich befinden.
[root@linuxmachine ~]# cat test.ps1
Get-ChildItem
[root@linuxmachine ~]# pwsh -file test.ps1
Directory: /root
Mode LastWriteTime Length Name
---- ------------- ------ ----
------ 6/26/17 8:57 AM 1318 anaconda-ks.cfg
------ 8/3/17 9:25 AM 593 Get-Stuff.ps1
------ 1/25/18 3:24 PM 1343 TestScript.ps1
------ 1/14/19 10:18 AM 14 AnotherScript.ps1
------ 7/10/17 4:40 PM 0 file.txt
Möchten Sie das Skript außerhalb der Eingabeaufforderung der PowerShell Core aufrufen, benutzen Sie den Befehl pwsh zusammen mit dem Parameter -File.