Open Source im professionellen Einsatz

Praktisch angewandt

Für die Programmieraufgabe aus der Einführung zu dieser Titelstrecke hält PHP selbstverständlich auch passende Funktionen bereit. Das Einlesen der CSV-Datei lässt sich mit »fgetcsv()« erledigen, Beispielcode zeigt Listing 5. Zunächst öffnet »fopen()« die CSV-Datei »liste.csv« . »fgetcsv()« holt aus ihr die nächste Zeile, extrahiert die einzelnen Datenfelder und legt diese dann umgehend in das Array »$data« . Die nachfolgende »foreach()« -Schleife gibt alle Elemente im Array der Reihe nach aus.

Listing 5

CSV-Datei einlesen

01 <?php
02         $datei = fopen("liste.csv", "r");
03         while (($data = fgetcsv($datei, 0, ",")) !== FALSE) {
04
05                 echo "Zeileninhalt:\n";
06                 foreach ( $data as $nr => $eintrag ) {
07                         $eintrag = trim($eintrag);
08                         echo "$eintrag\n";
09                 }
10
11         }
12         fclose($datei);
13         exit(0);
14 ?>

Aufgrund der »while()« -Schleife wiederholt sich diese Prozedur so lange, bis »fgetcvs()« das Ende der CSV-Datei erreicht hat und somit keine weitere Zeile zurückliefern kann. Viel komfortabler und kürzer geht es kaum. Der dritte Parameter von »fgetcsv()« gibt das Trennzeichen vor, in Listing 5 trennt ein Komma die Einträge. Tauscht der Admin es gegen einen Doppelpunkt, kann er ebenso einfach die Systemdatei »/etc/passwd« einlesen:

$datei = fopen("/etc/passwd", "r");
$data = fgetcsv($datei, 0, ":");

Das Gegenstück zu »fgetcsv()« heißt »fputcsv()« . Sie legt in CSV-Dateien halb-automatisch eine passende Zeile ab. Dazu übergibt der Programmierer der Funktion lediglich das gewünschte Trennzeichen sowie ein Array, in dem sich alle Daten für eine Zeile befinden:

$datensatz = array("tims", "Tim","Schürmann");
$datei = fopen("test.csv", "w");
fputcsv($datei, $datensatz, ",");

Auf der Kommandozeile erweisen sich vor allem die zahlreichen Posix-Funktionen als nützlich. So liefert etwa »posix_geteuid()« die Benutzer-ID zurück, unter der das Skript gerade läuft. Die kann man dann wiederum an »posix_geteuid()« verfüttern, was ein Array mit allen Benutzerinformationen ausspuckt. In Listing 6 ist dafür ein Beispiel zu sehen, die Ausgaben finden sich in Abbildung 2.

Listing 6

Prozesseigenschaften

01 <?php
02     $uid = posix_geteuid();
03     $benutzer = posix_getpwuid($uid);
04     echo "Benutzer des Prozesses: $benutzer[name] \n";
05     echo "UID: $benutzer[uid] \n";
06     echo "GID: $benutzer[gid] \n";
07     echo "Heimatverzeichnis: $benutzer[dir] \n";
08 ?>

Die Zugriffsrechte auf eine Datei ermittelt »posix_access()« . Listing 7 zeigt die Funktion in der Praxis, Abbildung 3 ein paar Beispielausgaben.

Listing 7

Test auf Dateirechte mit posix_access()

01 <?php
02     $existiert = posix_access("/etc/passwd", POSIX_F_OK);
03     if($existiert) echo "Datei existiert\n";
04
05     $lesen = posix_access("/etc/passwd", POSIX_R_OK);
06     if($lesen) echo "Darf Datei lesen\n";
07
08     $schreiben = posix_access("/etc/passwd", POSIX_W_OK);
09         if($schreiben) echo "Darf in Datei schreiben\n";
10
11     $ex = posix_access("/etc/passwd", POSIX_X_OK);
12     if($ex) echo "Darf die Datei ausführen\n";
13 ?>
Abbildung 3: Das Skript aus Listing 7, einmal als normaler Benutzer und einmal als Root aufgerufen.

Abbildung 3: Das Skript aus Listing 7, einmal als normaler Benutzer und einmal als Root aufgerufen.

Mit Dateien hantieren

Für fast jede Dateisystemoperation besitzt PHP eine entsprechende Funktion, teilweise sogar mehrere. So ändert »chmod()« die Zugriffsrechte einer Datei, »ls_dir()« prüft, ob der übergebene Dateiname ein Verzeichnis ist, »copy()« kopiert eine Datei und »mkdir()« legt ein neues Verzeichnis an:

mkdir("/home/tim/neu", 0700);

Das zweite Argument gibt die Zugriffsrechte an, in diesem Beispiel darf nur auf das Verzeichnis zugreifen, wer das Skript gestartet hat. Mit »scandir()« ist es zudem ein Leichtes, alle Dateien in einem Verzeichnis zu verarbeiten. Listing 8 gibt mit dieser Funktion alle Dateien des Unterverzeichnisses »Bilder« aus. Abbildung 4 zeigt die Funktion »getcwd()« .

Listing 8

scandir() im Einsatz

01 <?php
02         $dateien = scandir('Bilder');
03         foreach ($dateien as $datei) {
04                 echo "$datei \n";
05         };
06 ?>
Abbildung 4: Die Funktion getcwd() ermittelt das aktuelle Verzeichnis. Nach dem Start des Skripts ist dies genau das Verzeichnis, in dem der Anwender den Kommandozeilen-Interpreter aufgerufen hat.

Abbildung 4: Die Funktion getcwd() ermittelt das aktuelle Verzeichnis. Nach dem Start des Skripts ist dies genau das Verzeichnis, in dem der Anwender den Kommandozeilen-Interpreter aufgerufen hat.

Externe Programme startet die Exec-Funktion beispielsweise in der Form »exec("gzip test.txt")« . Praktischerweise kann der Admin im CLI fast alle PHP-Erweiterungen nutzen. So greift er etwa auf das erstellte Gzip-Archiv mit den entsprechenden Zlib-Funktionen zu. Beispielsweise schickt er dessen Inhalt auf die Konsole:

readgzfile("test.txt.gz");

Analog existieren noch weitere Funktionen, um etwa Zip- und Rar-Archive zu öffnen und zu manipulieren.

Mit den Kryptofunktionen generiert der Anwender schnell den eindeutigen Fingerabdruck einer Datei, im folgenden Beispiel mit dem MD5-Hashverfahren:

echo hash_file("md5", "test.txt");

Diese Funktionen sind nur ein kleiner Ausschnitt aus dem riesigen Angebot, das selbst exotische Wünsche befriedigen dürfte [2]. Es gibt sogar die Möglichkeit, über Ncurses-Funktionen eine kleine Benutzeroberfläche zu basteln.

Diesen Artikel als PDF kaufen

Express-Kauf als PDF

Umfang: 4 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