CLI-Adventskalender, Tag 23: PowerShell

CLI-Adventskalender: PowerShell

Avatar von Eric

Hinter dem vorletzten Türchen verbirgt sich die PowerShell. Also, lasst uns loslegen!

PowerShell

IT-Kultur ist strange. Viele Leute sind introvertiert, alle scheinen mehr zu wissen als wir. Wenn wir selbst introvertiert sind ist es nicht ganz klar, wie man es schafft, „dazuzugehören“.

Das ist die Funktion von Microsoft-Bashing. Oder Bashing im allgemeinen. Die Leute die – als ich noch ein Teenager war – auf Konferenzen Windows-Handbücher verbrannt haben, haben versucht, Gruppenzugehörigkeit zu finden. Ironischerweise war das aber den meisten Leuten zu extrem und die Leute galten als komisch … unter Leuten, die vom Mainstream schon oft als komisch betrachtet wurden.

Ich spreche heute mal über PowerShell. Ich habe ja schon über Bash gesprochen. Das eine ist eine Kommandozeile mit einer mächtigen Skriptsprache, die nicht nur unter Linux, sondern auch unter Windows läuft, Open Source und hoch konfigurierbar ist – und die Andere erfüllt zusätzlich den POSIX-Standard. Badum-tss.

„Aber, aber, Eric! Die Bash ist doch objektiv besser! Kannst Du mit der PowerShell etwa das machen?“

for i in {1..254}; do
  ping -c 1 192.168.0.$i | grep "64 bytes" &> /dev/null
  if [ $? -eq 0 ]; then
    echo "192.168.0.$i is up"
  else
    echo "192.168.0.$i is down"
  fi
done

Klar.

foreach ($i in 1..254) {
    $ip = "192.168.0.$i"
    if (Test-Connection -ComputerName $ip -Count 1 -Quiet) {
        Write-Host "$ip is up"
    } else {
        Write-Host "$ip is down"
    }
}


„Aber das hier …“

diff <(ls ordner/) < (ls backup/)

„… kannst Du ni-„

Compare-Object -ReferenceObject (Get-ChildItem -Path "ordner/" | Select-Object -ExpandProperty Name) -DifferenceObject (Get-ChildItem -Path "backup/" | Select-Object -ExpandProperty Name)

Zugegeben, die ausführlich benamten Befehle rollen jetzt nicht unbedingt von der Tastatur, aber dafür gibt es ja TAB-Vervollständigung und Aliases.

Set-Alias -Name syslog -Value Get-SystemEventlog

die sich im Profile-Script $PROFILE persistieren lassen.

Während Linux Webserver und Handies dominiert, machen Windows-Computer immer noch 70 Prozent der Desktopsysteme aus und Windows-Domänen sind noch immer stark verbreitet. PowerShell kommt vorinstalliert auf den meisten von ihnen. Kann man aber wirklich alles damit tun? Oder muss man durch unangenehme Reifen springen?

Eine Reise durch den Adventskalender

Das Jahr neigt sich dem Ende zu. Hier im Kommandozeilen-Adventskalender haben wir uns einen großzügigen Geschenkkorb voller Tools angeschaut. Nehmen wir die doch mal zur Orientierung.

Curl?

# Einfacher GET-Request
$response = Invoke-WebRequest -Uri 'https://example.com'
$response.Content

# JSON geht noch einfacher
$response = Invoke-RestMethod -Uri 'https://api.example.com/mondbasisping'
$response

Kann ich mit Invoke-RestMethod denn Zeiten in Jira buchen?

# Standard-Parameter wie in unserem curl-Skript:
$email = "email@example.com"
$api_token = "api_token_hier_rein"
$time_spent = "8h"
$ticket = "TICKET-123"
$comment = "Working on ticket."

# Parameter prüfen und Default-Parameter ggfls ersetzen
if ($args.Length -gt 0) {
  $time_spent = $args[0]
}
if ($args.Length -gt 1) {
  $ticket = $args[1]
}
if ($args.Length -gt 2) {
  $comment = $args[2]
}

# Body bauen
$body = @{
    timeSpent = $time_spent
    comment = $comment
} | ConvertTo-Json

# Ab die POST
Invoke-RestMethod -Uri "https://jira.example.com/rest/api/2/issue/$ticket/worklog" -Method Post -ContentType "application/json" -Body $body -Credential (New-Object PSCredential($email, (ConvertTo-SecureString $api_token -AsPlainText -Force)))


Es gibt auch sowas wie Manpages

Get-Help Invoke-RestMethod -Detailed

Sogar mit leicht erreichbaren Beispielen.

Get-Help Invoke-RestMethod -Examples

Und wenn ich eine SSH-Verbindung brauche?

Enter-PSSession -HostName mondbasis.mayflower.de -UserName eric

Aber sowas wie fzf …

cd $(find . -type d | fzf)

… gibt es in PowerShell sicher ni-

Install-Module -Name PSFzf -Scope CurrentUser
Import-Module PSFzf
cd (Get-ChildItem -Directory -Recurse | Select-Object -ExpandProperty FullName | Invoke-Fzf)

Windows, Linux … das ist doch alles das Gleiche heutzutage!

Nein, ok, soweit würde ich nicht gehen. Aber wenn wir mächtige Unix-Programme unter Windows brauchen, müssen wir dafür schon lange keine VM mehr hochfahren. Programme wie ImageMagick, ffmpeg, git und dot lassen sich unter Windows installieren und funktionieren auf der Kommandozeile genauso wie unter Linux. Ich möchte hier nicht einmal die Code-Snippets aus den anderen Artikel Copy-Pasten – sie sind wirklich einfach identisch.

Zusätzlich dazu kommt die PowerShell Gallery mit einer Reihe von herunterladbaren Modulen und Skripten. Azure – wen überrascht es – ist hier ein First-Class Citizen und Speculation Control (SPECTER und Co) ist mit mehr als einer halbe Milliarde Downloads das Populärste von ihnen; mit fünfzig Millionen Downloads mehr als selbt PSWindowsUpdate.

Nicht nur ein müdes Ersatzprodukt

Der lahme Witz in der Einleitung über den POSIX-Standard? Nun, da PowerShell nicht daran gebunden ist, kann sie ein paar ganz eigene Features mitbringen.

  • Objekt-Orientierung. Richtig gelesen. PowerShell ist eine komplett Objekt-orientierte Shell auf Basis von .NET – mit allem was dazu gehört.
  • Breite Palette an Befehlen („cmdlets“) und Skript-Konstrukten. Ja, es sieht over-engineered aus, aber auf der anderen Seite ist es konsistenter als viele Unix-Tools, die gerne ihren eigenen Weg suchen, um Konventionen umzusetzen.
  • Solides Microsoft-API. In einer Windows-Umgebung unterwegs? Du brauchst Zugriff auf das Dateisystem, die Registry und/oder Windows Management Instrumentation? Ich weiß, welches Tool ich wählen würde …
  • Zugang zum .NET-Ökosystem. Ganz gleich was man von .NET hält, es ist nicht erst gestern entstanden. Es existieren Bibliotheken, die alles unter der Sonne abdecken.

Unübertroffen in Windows-Administration

Wir Menschen sind Gewohnheitstiere. Wir greifen gerne zu den Tools die wir kennen und sind Alternativen gegenüber misstrauisch. Ich habe Linux auf meinem Arbeitslaptop und habe – aus meiner Perspektive – viele gute Gründe dafür. Viele unserer Kunden setzen auf Windows und haben viele gute Gründe dafür. Wenn ich ein Windows-System konfigurieren möchte und einen Cronjob brauche

0 10 * * * /hier/ein/tolles/skript.sh

schreibe ich stattdessen

$Action = New-ScheduledTaskAction -Execute 'Hier\gibt\es\ein\tolles\Skript.ps1'
$Trigger = New-ScheduledTaskTrigger -At 10:00am -Daily
Register-ScheduledTask -Action $Action -Trigger $Trigger -TaskName "Tolles Skript ausführen"

und es ist reiner Pragmatismus.

Ein solider Zugriff auf das Windows-API kann extrem nützlich sein.

Add-Type -TypeDefinition @"
    using System;
    using System.Runtime.InteropServices;
    using System.ServiceProcess;

    public class ServiceManager {
        public static void RestartService(string serviceName) {
            ServiceController service = new ServiceController(serviceName);
            service.Stop();
            service.WaitForStatus(ServiceControllerStatus.Stopped);
            service.Start();
            service.WaitForStatus(ServiceControllerStatus.Running);
        }
    }
"@

[ServiceManager]::RestartService("mssqlserver")

Und die Tür zu Azure? Steht weit offen.

# Was habe ich in meinem Account?
Get-AzVm

# Einmal die VM stoppen bitte
Stop-AzVm -ResourceGroupName "MeineResourceGroup" -Name "AzureTestBox"

# Neue VM anlegen
New-AzVm 
    -ResourceGroupName "MeineResourceGroup" 
    -Name "AzureProduktionsBox" 
    -Location "Germany West Central" 
    -VirtualNetworkName "MeinNetzwerk" 
    -SubnetName "MeinSubnet" 
    -SecurityGroupName "MeineNetzwerkSicherheitsGruppe" 
    -PublicIpAddressName "123.123.123.123" 
    -OpenPorts 80,3389
Shell-Weisheit des Tages
Es ist nicht das Tool, sondern die Einstellung

Tools ändern sich. Die Idee, mit einfachen Werkzeugen Aufgaben zu erledigen bleibt, bestehen. Selbst wenn Unix-Betriebssysteme über Nacht verschwinden würden, würden wir nach und nach dasselbe Tooling an einem anderen Ort aufziehen. Hier klinge ich vielleicht wie ein arroganter Developer „Wenn mir mein Betriebssystem nicht taugt, dann schreibe ich halt ein eigenes“, aber das ist nicht was ich meine.

Was ich meine ist: Ganz gleich was wir haben, es ist der Status quo. Ganz gleich welche Richtung wir einschlagen, die Arbeit wird niemals getan sein. Der Weg ist aber nicht das Ziel. Das Ziel ist es, alles ein kleines bißchen besser zu machen. Für uns selbst und idealerweise für andere. Kleine Optimierungen multiplizieren sich und ein Schneeball-Effekt entsteht. Heute schrauben wir an unserer .bashrc oder unserem PROFILE herum, ein paar Jahre später sind wir in der Lage, dreimal so gut unsere Arbeit zu machen.

Nichts von alledem hat irgendetwas mit Linux, Windows oder Mac zu tun. Technologie beginnt, wenn wir neue Lösungen für unsere Probleme suchen. Die Einstellungen, die wir dazu brauchen ist es

  1. Die Augen offen zu halten. Der Alltagstrott ist verführerisch und Ablenkungen sind überall. Es ist leicht, reaktiv anstelle von proaktiv zu leben.
  2. Unkritisch zu lernen. Wir schauen uns an wie Dinge funktionieren, selbst wenn wir mit den Designentscheidungen nicht einverstanden sind. In manchen Situationen ist es sehr sinnvoll, ABAP zu lernen. Es wird auch sehr gut bezahlt.
  3. Pietätlos zu verbessern. Als Individuen haben wir in der Regel nicht die Ressourcen, groß angelegte Lösungen zu konstruieren. Was wir alle haben ist Duct Tape. Wenn ein „doofes“ kleines Skript 90 Prozent der Fälle durch Brute Force lösen kann, kann das sehr viel Raum für wichtigere Dinge schaffen.

Wo ist die nächste, kleine Verbesserung, die weniger als eine Stunde dauert?

Avatar von Eric

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert


Für das Handling unseres Newsletters nutzen wir den Dienst HubSpot. Mehr Informationen, insbesondere auch zu Deinem Widerrufsrecht, kannst Du jederzeit unserer Datenschutzerklärung entnehmen.