Start · Sprachen · PHP · Referenz · shell_exec

shell_exec

Funktion

Führt einen Befehl über die Shell aus und gibt die gesamte Ausgabe als String zurück.

seit PHP 4.0.0 Kategorie: misc

Signatur

shell_exec(string $command): string|false|null

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

Typ
string|false|null
Beschreibung
Gibt die gesamte Ausgabe des Befehls als String zurück. Liefert 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>';
total 48 drwxr-xr-x 6 user user 4096 Jan 01 12:00 . drwxr-xr-x 10 user user 4096 Jan 01 11:00 .. -rw-r--r-- 1 user user 512 Jan 01 12:00 index.php ...

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));
}
Zeilenanzahl: 42 example.txt

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);
Hallo Warning: Fehler! in Command line code on line 1

// 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.