Open Source im professionellen Einsatz

Das Os.path-Modul

Das Gleiche ist sicherlich auch an der Bash möglich, wo Tools wie Wget, Grep, Sed und Awk Dienste tun. Doch solche Skripte sind meist weniger robust und schwerer lesbar als Listing 1. Außerdem läuft hier alles in einem Python-Prozess ab, statt wie die Bash mehrere Sub-Prozesse zu forken.

Ein weitere typischer Fall für Skriptsprachen ist der Umgang mit Dateien: An der Bash sind – unter anderem [5] – Leerzeichen Fehlerquellen, die bei sicherheitsbewussten Admins regelmäßig Skripte aufblasen oder aber fehlerträchtig machen. Die Bash verarbeitet einen Dateinamen nur als String, nichts mehr. Von Haus aus kann sie Leerzeichen und Separatoren nicht unterscheiden. In Python beinhaltet das »os.path« -Interface bereits alle Operationen, die im Admin-Alltag im Zusammenhang mit Dateien vorkommen.

Generatoren

Eine Schlüsselrolle in Python nehmen die Generatoren ein. Diese simplen Funktionen arbeiten ganz ähnlich wie Listen:

for root, dirs, files in os.walk('/tmp'):
 print root

In diesem Fall erzeugt »os.walk()« eine lange Liste, die sich mit einer For-Schleife beackern lässt. Nett dabei ist, dass »os.walk()« das Filesystem just in dem Moment ausliest, wenn es die Daten ausgibt, ähnlich dem »find« -Kommando:

find /tmp -type d -exec echo {} \;

Um alle Dateien aus dem Verzeichnis »/tmp« zu löschen, reicht in Python:

for root, dirs, files in os.walk('/tmp'):
 for file in files:
 os.remove(os.path.join(root, file))

»os.path.join« macht das Skript sicherer und transportabel. Die Funktion bewirkt, dass Python – auch auf Windows-Systemen – immer den richtigen, für das Betriebssystem definierten Trenner (Field separator) für Dateinamen verwendet. Das Kommando »print os.path.join('/tmp','Dateiname')« gibt dann »/tmp/Dateiname« zurück.

Zum Öffnen von Dateien dient »f = open('Dateiname', 'r')« , was sich stark an den C-Stil anlehnt und einen Modus für das Öffnen annimmt. Hier steht »r« für read-only, »w« für Lesen und Schreiben. Ein »print f.readlines()« schreibt jetzt die Ausgabe in die Datei »Dateiname« . Analog zum Apache-Beispiel oben liest »readlines()« alle Daten aus dem File und gibt sie als Liste von Strings zurück.

Für kleine Dateien mag das ausreichen, bei großen Datenmengen wird es jedoch zum Speicherfresser. Deshalb bietet es sich an, mit »f.readline()« immer nur die nächste Zeile oder mit »f.read(1024)« die nächsten 1024 Bytes einzulesen. Ersteres reicht in fast allen Fällen.

Das »os.path« -Modul bietet noch viele weitere Funktionen, zu denen Basename, Abspath (zum Normalisieren von symbolischen Links), Getatime, Getmtime, Getctime und Exists gehören. Ipython ([6], siehe Kasten "Interaktives Python") bringt sogar eine Kommandozeile für die Skriptsprache.

Interaktives Python

Wer eine Aufgabe vor sich hat, die ein wenig abseits der klassischen Pfade liegt und die er am Bash-Prompt nicht lösen kann, sollte sich Ipython [6] ansehen. Er erhält nach dem Aufruf von »ipython« eine interaktive Shell mit einem Python-Interpreter. Die kombiniert Shellkommandos wie Ls und Cd mit Tab-Completion und einem vollständigen Python-Environment.

Ipython verwenden

Nach dem Start präsentiert Ipython dem Anwender einen Prompt in Form von »In [1]: « . In der ersten Zeile des Beispiels aus Abbildung 2 gibt der Benutzer »import os« ein, um das »os« -Modul zu laden, und bestätigt mit [Return]. Der Prompt verändert sich zu »In [2]: « . Hier tippt der User die For-Schleife »for dir in os.walk('/tmp'):« ein, wiederum gefolgt von [Return]. Jetzt ändert Ipython den Prompt zu »...: « – bereits gefolgt von der richtigen Anzahl an Tabulatoren. Um die korrekte Einrückung braucht der Anwender sich hier nicht zu kümmern, diese Aufgabe nimmt ihm Ipython ab. Das eingegebene »print dir« , gefolgt von dreimal [Return], lässt Ipython den Inhalt des Verzeichnisses »/tmp« auflisten. Wie in der Bash funktioniert auch hier die automatische Vervollständigung von Kommandos mit der Tabulatortaste.

Abbildung 2: Ipython ist eine interaktive Schnittstelle zu Python, die sich anfühlt wie eine Shell.

Ipython bietet sich vor allem fürs Erstellen eigener Skripte und das Erlernen der Syntax an. Auch das Einrücken erledigt die Shell von selbst, eine Leerzeile entfernt unerwünschte Einzüge. Die Ausgabe der Bash lässt sich mit Befehlen wie »a = !ps aux« in Variablen umleiten, analog zur Parametersubstitution der Linux-Shell. Ein einfaches »a« zeigt den Inhalt der Variablen an, mit »page a« benutzt Ipython den Standardpager der Bash (in der Regel Less).

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 3 Heftseiten

Preis € 0,99
(inkl. 19% MwSt.)

Als digitales Abo

Als PDF im Abo bestellen

comments powered by Disqus

Ausgabe 07/2013

Preis € 6,40

Insecurity Bulletin

Insecurity Bulletin

Im Insecurity Bulletin widmet sich Mark Vogelsberger aktuellen Sicherheitslücken sowie Hintergründen und Security-Grundlagen. mehr...

Linux-Magazin auf Facebook