Start · Sprachen · PHP · Referenz · system

system

Funktion

Führt einen externen Befehl aus, gibt dessen Ausgabe direkt aus und liefert die letzte Ausgabezeile zurück.

seit PHP 4.0.0 Kategorie: misc

Signatur

system(string $command, int &$result_code = null): string|false

Beschreibung

system() übergibt den angegebenen Befehl an die Systemshell und gibt die erzeugte Ausgabe direkt an den Client aus (ähnlich wie echo). Im Gegensatz zu exec() werden alle Ausgabezeilen des Befehls sofort ausgegeben, nicht erst in ein Array gesammelt. Als Rückgabewert wird lediglich die letzte Zeile der Ausgabe als String geliefert, oder false bei einem Fehler.

Der optionale zweite Parameter $result_code wird mit dem Exit-Code des ausgeführten Befehls befüllt (0 bedeutet in der Regel Erfolg). Dies ist nützlich, um zu prüfen, ob ein externer Prozess fehlerfrei abgeschlossen wurde.

Die Funktion eignet sich für einfache Szenarien, in denen die Ausgabe eines Shell-Befehls direkt an den Browser oder die Konsole weitergeleitet werden soll, beispielsweise bei einfachen Administrations-Skripten auf der Kommandozeile. Für komplexere Anforderungen wie bidirektionale Kommunikation mit einem Prozess empfiehlt sich proc_open().

Achtung: Der Einsatz von system() birgt erhebliche Sicherheitsrisiken, wenn Benutzereingaben in den Befehl einfließen. Alle externen Daten müssen zwingend mit escapeshellarg() oder escapeshellcmd() gesichert werden.

Parameter

Name Typ Default Beschreibung
$command Pflicht string Der auszuführende Shell-Befehl als Zeichenkette. Wird direkt an die Systemshell übergeben. Niemals ungeprüfte Benutzereingaben direkt einbetten.
$result_code int null Wird nach dem Aufruf mit dem Exit-Code des ausgeführten Befehls befüllt. Ein Wert von 0 signalisiert in der Regel erfolgreiche Ausführung.

Rückgabewert

Typ
string|false
Beschreibung
Gibt die letzte Ausgabezeile des ausgeführten Befehls als String zurück. Bei einem Fehler oder wenn der Befehl keine Ausgabe erzeugt, wird false zurückgegeben.

Beispiele

Einfache Ausführung eines Shell-Befehls mit Exit-Code-Prüfung

<?php
// Listet den Inhalt des aktuellen Verzeichnisses auf (Unix)
$exitCode = 0;
$lastLine = system('ls -la /tmp', $exitCode);

echo PHP_EOL . '--- Letzte Zeile: ' . $lastLine . PHP_EOL;
echo 'Exit-Code: ' . $exitCode . PHP_EOL;
total 48 drwxrwxrwt 12 root root 4096 Jan 01 12:00 . drwxr-xr-x 19 root root 4096 Jan 01 00:00 .. ... --- Letzte Zeile: ... Exit-Code: 0

Sichere Übergabe von Benutzerdaten mit escapeshellarg()

<?php
// Benutzereingabe aus einem Formular
$userFile = $_GET['filename'] ?? 'example.txt';

// Eingabe MUSS mit escapeshellarg() gesichert werden!
$safeFile = escapeshellarg($userFile);

$exitCode = 0;
$result = system('wc -l ' . $safeFile, $exitCode);

if ($exitCode !== 0) {
    echo 'Fehler beim Ausführen des Befehls (Exit-Code: ' . $exitCode . ')' . PHP_EOL;
} else {
    echo PHP_EOL . 'Zeilenanzahl-Ausgabe: ' . $result . PHP_EOL;
}
42 'example.txt' Zeilenanzahl-Ausgabe: 42 'example.txt'

// Wichtig · Fallstricke

Sicherheitswarnung: Das direkte Einbetten von Benutzereingaben in den Befehlsstring führt zu Command-Injection-Angriffen. Ein Angreifer könnte z. B. den Dateinamen ; rm -rf / übergeben und damit beliebige Befehle ausführen. Verwende immer escapeshellarg() für einzelne Argumente und escapeshellcmd() für den gesamten Befehl.

Auf vielen Shared-Hosting-Umgebungen ist system() über die PHP-Direktive disable_functions deaktiviert. Eine Alternative ist exec() oder shell_exec(). Im Safe Mode (bis PHP 5.3) unterlag system() zusätzlichen Einschränkungen.

Da system() die Ausgabe direkt schreibt, ist sie bei langen Prozessen für den Einsatz im Web ungeeignet – der Browser erhält einen unvollständigen HTTP-Stream. Für Hintergrundprozesse empfiehlt sich proc_open() oder das Umleiten der Ausgabe in eine Datei.