Eine Einführung in die Linux cli

In diesem Artikel wollen wir uns eingehend mit der Linux Kommandozeile BASH befassen und vor allem Anfänger die richtigen Werkzeuge und Methoden an die Hand geben, um möglichst schnell mit Linux Systemen umgehen zu können. Wir werden grundlegende Navigation und Dateisystemoperationen wie Kopieren, Löschen, Ändern kennen lernen, sowie uns mit Berechtigungen, Nutzern und Gruppen befassen. Im weiteren Verlauf werden wir uns dann mit kleinen Skripten befassen um euch das alltägliche Arbeiten als Linux-Admin ein wenig einfacher zu machen. Dazu gehen wir insbesondere etwas spezieller auf das Thema Log-Auswertungen ein.

Dieser Artikel erklärt auch grundlegende Themen. Ihr könnte also ruhig Abschnitte überspringen, mit denen ihr bereits vertraut seid.

SETUP oder Wie komm ich da eigentlich ran?

Viele Wege führen nach Rom und so auch zur Bash. Die gängigste Art zu einem Linux-Server zu verbinden ist mit Sicherheit SSH und dort das Programm PuTTY. Wenn ihr bereits auf einem Linux System seid, befindet ihr euch entweder bereits in der Shell (die Kommandozeile) oder könnt diese über Terminal aufrufen. Beides wollen wir hier kurz behandeln.

Verbindung über SSH

Die überwiegende Mehrheit aller Linux Systeme sind Server ohne grafische Oberfläche. Ähnlich wie Ihr euch über RDP  zu einem Windows-Server in eurem Netzwerk verbinden könnt, stellen die meisten Linux Server eine Möglich zur Verbindung per SSH bereit.

PuTTY

Dazu benötigt ihr unter Windows ein entsprechendes Programm.
Am häufigsten wird hierzu PuTTY verwendet. Das erhaltet ihr kostenlos hier: https://www.putty.org/
Ihr könnt PuTTy entweder installieren oder standalone als exe herunterladen:

Fertig heruntergeladen und gestartet sieht PuTTY dann folgendermaßen aus:

Als Protokoll ist bereits SSH ausgewählt und der Standard-Port 22 eingetragen. Ihr müsst also nur den Hostname/IP eures Servers eintragen und auf Open drücken.

Powershell

Wer sich lieber mit systemeigenen Tools befasst, für den bietet die Windows PowerShell einen integrierten SSH Client.
Der Befehl dafür lautet: ssh [username]@[IP/Hostname]

Andere Betriebssysteme

Für MacOS gibt es ähnlich dem in der PowerShell integrierten Client einen im Terminal integrierten SSH Client. Die Syntax ist dabei dieselbe wie bei Powershell ssh [username]@[IP/Hostname]

 

Erste Schritte oder Bin ich schon drin?

Nachdem wir uns mit einem Client unserer Wahl verbunden haben sehen wir die Kommadozeile in all ihrer Pracht. Je nach System erhalten wir beim Login noch eine Nachricht die uns Aufschluss darüber gibt auf welchem Server wir sind.

Die wichtigsten Befehle für die Navigation in der BASH

Wer bereits ein Wenig mit der Kommandozeile unter Windows rumprobiert hat wir feststellen, dass es sich ähnlich in Linux verhält.

ls            zeigt euch den aktuellen Verzeichnisinhalt äquivalent zum Windows-Befehl dir an. Mit dem Argumenten -lah bereiten wir die Ansicht für uns als Liste (-l) mit allen Elementen (-a) und menschenlesbaren Einheiten (-h) auf

cd           wechselt das Verzeichnis.

mkdir    erstellt ein Verzeichnis

touch    erstellt eine Datei

rm          löscht eine Datei. Mit den Argumenten -rf auch Verzeichnisse und Rekursiv.

cp [QUELLE] [ZIEL]           kopiert eine Datei

mv [QUELLE] [ZIEL]         verschiebt eine Datei

Tab allmighty

Alle Befehle könnt ihr durch Drücken der Tab-Taste vervollständigen lassen. Dadurch müsst ihr euch nicht alle Befehle merken, oder jeden Ordnernamen austippen. Ein gutes Beispiel ist hier der Befehl journalctl welcher euch Informationen über Systemmeldung gibt. Hier genügt es jou zu tippen und mit TAB zu vervollständigen.

Tab vervollständigt kontextsensitiv. Für den Befehl cd werden also Ordner vorgeschlagen, und für cp Dateien und Ordner.

Mit den Tasten ˄ bzw ˅ (Pfeiltasten) lässt sich durch die Befehlshistorie scrollen und bereits ausgeführte Befehle erneut ausführen. Mit dem Befehl history wird euch die Historie des aktuellen Nutzers auch angezeigt.

Speicherstruktur oder Wo ist C:\?

In Linux beginnt die Dateistruktur in / was in Windows also etwa C:\ wäre ist in Linux einfach /

Dort finden wir alles was zu unserem System gehört. Nutzerverzeichnisse liegen unter /home/username, Logdateien unter /var/log.

In Linux gilt der Grundsatz: Alles ist eine Datei. Ihr findet also beispielsweise eine Datei, die euch aktuelle Daten über eure Speicherauslastung liefert oder eine Datei die eure Festplatte und einzelne Partitionen davon repräsentiert.

Rechte werden in Linux in r(read/lesen), w(write/schreiben) und x(execute/ausführen) unterschieden. Die Rechte werden jeweils für den Besitzer, die besitzende Gruppe und alle anderen beschrieben. In unserem Screenshot oben ist der Besitzer des Ordners /var der Nutzer root und darf lesen, schreiben und ausführen. Die Gruppe ist root und darf lesen und ausführen genauso wie jeder andere Nutzer. Ihr könnt diese Rechte über den Befehl chmod anpassen. Ihr könnt den Besitzer von Dateien und Ordner über chown ändern.

SUDO/ROOT oder Godmode

Was unter Windows der Administrator ist ist unter Linux der Benutzer root.

Er hat ohne Einschränkungen alle Recht auf dem System. Genau aus diesem Grund sollte dieser Nutzer nur mit Vorsicht verwendet werden.

Das Äquivalent von „Ausführen als Administrator“ ist unter Linux der Befehl sudo. Er führt den folgenden Befehl mit root-Rechten aus.

Beispielsweise sudo ls -lah /root zeigt euch den Inhalt des Home-Verzeichnisses des Root-Users sofern ihr die Berechtigung zum Ausführen von sudo-Befehlen habt.

Insbesondere Dienste oder Programme mit Netzwerkkonnektivität sollten niemals als root ausgeführt werden, da eine Sicherheitslücke in dem Programm fatale Auswirkungen auf das gesamte System hätte.

Dateiausgabe oder Sehen bedeutet glauben

Wenn alles eine Datei ist, wäre es ja auch ganz schön deren Inhalt auch zu kennen, um für uns Informationen zu gewinnen. Zur Ausgabe von Dateiinhalten stehen euch mehrere Befehle zur Verfügung. Hier eine kleine Auswahl:

cat          Der gängigste Befehl zur Ausgabe von Dateiinhalt. Gibt den gesamten Dateiinhalt aus. Kann bei großen Dateien schnell übersichtlich werden.

less        Zeigt euch eine scrollbare Version des Dateiinhalts

more     Zeigt euch eine scrollbare Version des Dateiinhalts

head     Zeigt euch die ersten 10 Zeilen einer Datei. Hier könnt ihr auch die Menge der Zeilen angeben, die Ihr gerne hättet, also bspw.: head -20 gibt euch die ersten 20 Zeilen einer Datei.

tail         Zeigt euch die letzten 10 Zeilen einer Datei. Hier könnt ihr auch die Menge der Zeilen angeben, die Ihr gerne hättet, also bspw.: tail -20 gibt euch die letzten 20 Zeilen einer Datei. Mit dem Argument -f könnt ihr euch auch fortlaufend die neu hinzukommenden Zeilen anzeigen lassen.

Beispielhaft hier die Ausgabe der Datei /proc/meminfo

Welche uns detaillierte Informationen über die Größe und Auslastung des Arbeitsspeichers gibt.

Wenn wir Dateien verändern wollen, hilft uns ein Texteditor.

Gängig sind die Texteditoren nano und vim. Anfänger sollten sich an nano halten, weil die Tastaturkürzel etwas intuitiver sind. Wir können einfach eine Datei öffnen in dem wir dem Editor unserer Wahl den Dateinamen mitgeben. Ist die Datei noch nicht vorhanden wird sie für uns erstellt.

Mit STRG+O lässt sich die Änderung speichern mit STRG+X das Programm beenden.

Unter vim müssen wir zuerst mit einfg in den Insert-Modus wechseln bevor wir schreiben dürfen

ESC drücken, um den Modus wieder zu verlassen. Wir tippen: wq (write und quit) und bestätigen mit Enter, um den Editor zu schließen und unsere Änderungen zu speichern.

Filtern und Umformen oder Ich mach mir die Welt wie sie mir gefällt

Ausgaben können mitunter äußerst umfangreich und unübersichtlich sein. Bash gibt uns hier eine Reihe von Werkzeugen an die Hand, mit der wir Ausgaben filtern und verändern können, um uns das Leben leichter zu machen. Hier eine kleine Auswahl von Befehlen auf die wir im Nachgang teilweise noch näher eingehen:

grep [Ausdruck] [DATEI]              Sucht nach einem Ausdruck innerhalb einer Datei und gibt uns alle Zeilen zurück, in welchen der Ausdruck gefunden wurde.

cut                                                Teilt ausgaben an einem bestimmten Zeichen und gibt euch die Felder eurer Wahl zurück

sed                                               ein umfangreicher Stream-Manipulator zu dem wir später noch in einem Beispiel eingehen werden

awk                                               ein umfangreicher Text-Manipulator zu dem wir später noch in einem Beispiel eingehen werden

tr                                                   entfernt bestimmte Zeichen aus der Ausgabe

 

Im weiteren Verlauf dieses Artikels soll uns ein mail.log als Anschauungsobjekt dienen.

Namen und Adressen wurden natürlich geändert.

Wir suchen eine Mail die von monitoring@demo-mail.local verschickt wurde, beginnen also mit:

grep monitoring demo.log         sucht den Begriff monitoring in der Datei demo.log

Verketten oder 2 Befehlen bringen mehr als einer

Wenn uns ein einziges Filterkriterium nicht ausreicht können wir unter Linux Befehle verketten. Dazu dient wie in den meisten anderen Kommandozeilen auch das | Symbol (links zwischen Shift und Y).

Damit können wir die Ausgabe eines Befehls als Eingabe für den nächsten Verwenden. In unserem konkreten Beispiel verwenden wir dies um nur die MailIDs zu filtern. Dazu schneiden wir mit cut beim : die Ausgabe und lassen uns das 4te Feld ausgeben.

Also grep monitoring demo.log | cut -d‘:‘ -f4

Wir können uns auch eine Menge an Feldern ausgeben lassen

grep monitoring demo.log|cut -d‘:‘ -f1,2,4

Ähnliches ist mit awk möglich. In dem wir uns das 6te Argument ausgeben lassen. Argumente sind in awk per Tab oder Leerzeichen getrennt.

grep monitoring demo.log|awk ‚{print $6}‘

Mit sed lässt sich beispielsweise das : durch _ID ersetzen. Die Syntax von sed mag am Anfang etwas wahllos wirken wird aber nach etwas Recherche relativ eindeutig.

grep monitoring demo.log|awk ‚{print $6}’|sed -e ’s/\:/_ID/g‘

Hängen wir jetzt noch ein head -3 an bekommen wir nur die ersten 3 Einträge, die auf unser Ergebnis passen:

So könnt ihr euch eure Ausgabe zusammenbauen wie Ihr wollt und filtern, bis die Ausgabe nur enthält was für euch relevant ist. Sagen wir beispielsweise die letzten 5 Mails von Monitoring die vom System abgeschickt wurden:

grep monitoring demo.log|grep ’status=sent’|tail -5

REGEX oder Ich suche was in DER Art

Zum Suchen und Filtern gibt es regular Expressions. Es handelt sich hierbei um eine Sprache die dazu entwickelt wurde bestimmte Muster zu beschreiben. Dazu gibt es bereits hervorragende Übungs- und Lernseiten wie https://regexone.com/ oder https://regex101.com/.

Regex könnt ihr in diversen Programmen und Tools verwenden. In unserem Beispiel setzen wir es zusammen mit grep ein um IP-Adressen aus unserem Log zu filtern.

Wir bauen uns also unseren Filterausdruck anhand einer IP zusammen

IP: 1.23.456.789

Wir suchen also eine Gruppe aus 4x 1-3 Zahlen die mit Punkten getrennt sind. Die Menge der Zahlen könnt ihr in Regex bspw. Als [0-9] angeben und mit {1,3} die Menge bestimmen. In diesem Fall mindestens {1,3}  maximal jedoch {1,3}.

Der Punkt ist in Regex das Wildcard-Symbol, ähnlich wie in anderen Sprachen der Stern * wir müssen diesen als mit einem Backslash \ von der Verarbeitung als Syntax ausschließen (auch escapen genannt).

Unser Ausdruck sieht also folgendermaßen aus:

[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}

Es handelt sich hierbei um einen vereinfachten Suchausdruck. In der Praxis würdet ihr beispielsweise Zahlen größer 255 ausschließen wollen da sie nicht zu einer gültigen IP gehören.

Wir verwenden also die Argumente -E für unseren regulären Ausdruck und -o um nur die Zeichen zu erhalten die auch wirklich passen anstatt der ganzen Zeile.

grep -E ‚[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}‘ -o demo.log

Auswertung und Sortieren oder Et Pluribus Unum

Die reinen vorkommenden IPs geben uns leider noch nicht so richtig viel Aufschluss über beispielsweise die Menge der Verbindungen hier kommen folgende Tools zum Einsatz:

uniq      Vereinzelt die nacheinander vorkommenden Wiederholungen eines Ausdrucks

sort        Sortiert nach beliebigen Kriterien

wc          Zählt die Anzahl von Wörtern oder Zeilen

Weil uniq nur direkt nacheinander folgende Doppelungen vereinzeln sortieren wir erst einmal mit sort vor, lassen dann mit uniq vereinzeln und direkt mit dem Argument -c zählen. Danach sortieren wir nochmal mit -n numerisch und lassen uns die beiden häufigsten IPs mit tail -2 ausgeben

grep -E ‚[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}‘ -o demo.log |sort|uniq -c|sort -n|tail -2

Diese Methodik ist auf alle Logdateien anwendbar und eignet sich beispielsweise hervorragend, um DDoS oder BruteForce Attacken in Access-Logs von Web-Servern zu erkennen.

Mit dem Tool whois könnt ihr euch außerdem Informationen zu einem bestimmten IP-Adressbereich geben lassen und entscheiden ob die Anfrage sinnvoll ist oder nicht.

Skripte oder In der Kürze liegt die Würze

Verkettete Befehle wie in unserem Beispiel sind zwar praktisch aber in der alltäglichen Praxis doch eher umständlich zu tippen und besonders, wenn man mal nachts von einem rebellischen Service aus dem Bett geklingelt wird nur mit sehr viel Geduld über das Display des Handys einzutippen.

Wohle also dem, welcher diese Befehle in Skripte verpackt und sich damit das Leben leichter macht.

Skripte und Skriptsprachen gibt es viele. So gibt es auch in Linux diverse Interpreter, welche unser Skript ausführen könnten, wir halten uns aber im Rahmen des Artikels an Bash. Ihr seid bei der Namenswahl eurer Skripte grundsätzlich frei, es empfiehlt sich aber Ihnen die Endung .sh zu geben damit auch andere direkt wissen um was es sich dabei handelt.

Wir beginnen unser Skript mit der Zeile:

#!/bin/bash

Damit geben wir dem System die Informationen, dass dieses Skript mit Bash auszuführen ist. Zusätzlich schreiben wir in die folgenden Zeilen Kommentare von wann und wem das Skript geschrieben wurde und zu welchem Zweck. Das ist zwar technisch nicht notwendig, hilft euch und anderen aber dabei auch nach Jahren noch zu durchblicken was in diesem Skript passiert und warum.

Für den Anfang wollen wir unseren eben zusammengestellten Befehl in unser Script einbinden.

Dazu öffnen wir unser Skript mit dem Befehl nano demoskript.sh wer möchte kann natürlich auch vim dafür nehmen.

Wir speichern mit strg+o und strg+x oder unter vim mit :wq

Im Anschluss geben wir noch uns selbst das Recht die Datei auszuführen mit chmod u+x bedeutet in diesem Fall dass der besitzende User das Recht eXecute (ausführen) erhält.

Ausführen können wir unser Skript mit ./demoskript.sh

./ bedeutet hierbei, dass das Skript in dem Ordner liegt in dem wir uns gerade befinden.

Und wir sehen, unser Demoskript tut genau was es soll, uns jede Menge Tipperei ersparen.

Ende oder STRG+D

Damit soll die kurze Einführung in BASH an dieser Stelle abgeschlossen sein. Ich hoffe ich konnte euch ein wenig die grundlegenden Möglichkeiten der Bash an die Hand geben. Ihr habt gelernt wie ihr in Ordner navigiert, Dateien öffnet und wieder schließt, wie ihr Befehle verkettet, Ausgaben filtert und Log-Dateien durchsucht und habt euch ein wenig Tipperei über ein kleines Skript erspart.

Die BASH und Linux bieten euch allerdings noch deutlich mehr Möglichkeiten und wer eine Weile damit gearbeitet hat, möchte sie nicht mehr missen.

In den noch kommenden Artikeln gehen wir dann deutlich tiefer auf Skripte zum alltäglichen Gebrauch ein. Dort lernt ihr dann wie ihr Variablen einbindet und Argumente mit eurem Skript verarbeitet. Freut euch also auf eine noch deutlich tiefergehende Reise in die Welt der Linux-Shell.  

Mathias Feld

Mathias Feld

Senior System Engineer

Gefällt dir der Artikel? Bitte teile ihn!
Share on Facebook
Facebook
0Share on LinkedIn
Linkedin
Email this to someone
email
Tweet about this on Twitter
Twitter