Signatur
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
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;
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;
}
// 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.