Signatur
Beschreibung
shell_exec() übergibt den angegebenen Befehl an die System-Shell (unter Unix /bin/sh, unter Windows cmd.exe) und liest dessen gesamte Standardausgabe (STDOUT) in einen String. Die Funktion ist funktional äquivalent zum Backtick-Operator (`command`) in PHP.
Sie eignet sich besonders dann, wenn man die vollständige Ausgabe eines Shell-Programms als String benötigt und anschließend weiterverarbeiten möchte – etwa beim Parsen von CLI-Tool-Ausgaben, Skript-Automatisierungen oder dem Abruf von Systeminformationen. Im Gegensatz zu exec() wird die Ausgabe nicht zeilenweise zurückgegeben, sondern als ein einziger zusammenhängender String inklusive Zeilenumbrüchen.
Wichtig: Nur STDOUT wird erfasst. Fehlermeldungen (STDERR) werden nicht automatisch zurückgegeben; um auch STDERR zu erhalten, muss der Shell-Befehl entsprechend umgeleitet werden (z. B. 2>&1). Der Exit-Code des Prozesses ist über shell_exec() nicht abrufbar.
Sicherheitshinweis: Benutzereingaben dürfen niemals ungefiltert in den Befehl eingebettet werden. Verwende stets escapeshellarg() oder escapeshellcmd(), um Shell-Injection-Angriffe zu verhindern. Die Funktion ist deaktiviert, wenn PHP im Safe Mode läuft oder shell_exec in der disable_functions-Direktive aufgelistet ist.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $command Pflicht | string | Der auszuführende Shell-Befehl. Benutzereingaben müssen zuvor mit escapeshellarg() oder escapeshellcmd() gesichert werden. |
Rückgabewert
null, wenn der Befehl keine Ausgabe erzeugt oder ein Fehler auftritt. Gibt false zurück, wenn die Ausführung fehlschlägt (z. B. wenn die Funktion deaktiviert ist).Beispiele
Aktuelles Verzeichnis auflisten
<?php
// Gibt den Inhalt des aktuellen Verzeichnisses zurück
$output = shell_exec('ls -la');
echo '<pre>' . htmlspecialchars($output) . '</pre>';
Benutzereingabe sicher verarbeiten
<?php
// Unsichere Eingabe sicher in den Befehl einbetten
$userInput = $_GET['filename'] ?? 'example.txt';
$safeInput = escapeshellarg($userInput);
$output = shell_exec('wc -l ' . $safeInput);
if ($output === null) {
echo 'Keine Ausgabe oder Fehler beim Ausführen des Befehls.';
} else {
echo 'Zeilenanzahl: ' . htmlspecialchars(trim($output));
}
STDERR zusammen mit STDOUT erfassen
<?php
// Fehlerausgabe (STDERR) zusammen mit der normalen Ausgabe (STDOUT) erfassen
$command = 'php -r "echo \'Hallo\'; trigger_error(\'Fehler!\', E_USER_WARNING);" 2>&1';
$output = shell_exec($command);
echo htmlspecialchars($output);
// Wichtig · Fallstricke
Sicherheit (Shell-Injection): Das direkte Einbetten von Benutzereingaben in Shell-Befehle ist eine der gefährlichsten Sicherheitslücken in PHP-Applikationen. Ein Angreifer könnte beliebige Befehle ausführen. Verwende immer escapeshellarg() für einzelne Argumente oder escapeshellcmd() für den gesamten Befehl.
Deaktivierung: Die Funktion kann durch die disable_functions-Direktive in der php.ini deaktiviert sein – dies ist auf Shared-Hosting-Umgebungen häufig der Fall. In diesem Fall wird false zurückgegeben.
Kein Exit-Code: shell_exec() liefert keinen Rückgabecode des Prozesses. Wenn der Exit-Code benötigt wird, sollte stattdessen exec() oder proc_open() verwendet werden.
Safe Mode (veraltet): Im früheren PHP Safe Mode (bis PHP 5.3) war die Funktion eingeschränkt; seit PHP 5.4 ist der Safe Mode entfernt.