Signatur
Beschreibung
expect_expectl() ist Teil der Expect-Erweiterung für PHP und ermöglicht die Interaktion mit interaktiven Prozessen (z. B. SSH, FTP, Passwortabfragen). Die Funktion blockiert so lange, bis eine der in $cases definierten Bedingungen eintritt: ein regulärer Ausdruck passt auf die Prozessausgabe, ein Timeout abläuft oder EOF erreicht wird.
Die Liste $cases ist ein Array von Arrays, wobei jeder Eintrag aus einem Muster, einem Rückgabewert und optional einem Typ (z. B. EXP_GLOB, EXP_EXACT oder EXP_REGEXP) besteht. Der Rückgabewert des jeweiligen Treffers wird als Ganzzahl zurückgegeben und ermöglicht eine switch-artige Verarbeitung.
Über den optionalen Parameter $match kann der gematchte Text nach dem Aufruf ausgelesen werden. Das ist insbesondere nützlich, wenn Teilstrings oder Gruppen extrahiert werden sollen.
Die Funktion setzt eine geöffnete Expect-Ressource voraus, die mit expect_popen() erzeugt wurde. Sie eignet sich für die Automatisierung von Kommandozeilen-Workflows, bei denen eine direkte Benutzereingabe erwartet wird.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $expect Pflicht | resource | Eine Expect-Stream-Ressource, die zuvor mit expect_popen() geöffnet wurde. |
|
| $cases Pflicht | array | Ein Array von Arrays, bei dem jeder Eintrag die Form [Muster, Rückgabewert] oder [Muster, Rückgabewert, Typ] hat. Gültige Typen sind EXP_GLOB (Standard), EXP_EXACT und EXP_REGEXP. |
|
| $match | array | [] | Optionale Referenz auf ein Array, das nach dem Aufruf den gematchten Text und eventuell Teilübereinstimmungen enthält. |
Rückgabewert
$cases-Eintrags zurück. Im Falle eines Timeouts wird EXP_TIMEOUT zurückgegeben, bei EOF EXP_EOF, bei einem Fehler EXP_FULLBUFFER.Beispiele
SSH-Passwortabfrage automatisieren
<?php
// Voraussetzung: Expect-Erweiterung ist installiert und geladen
ini_set('expect.timeout', 10);
$stream = expect_popen('ssh benutzer@beispiel.de');
switch (expect_expectl($stream, [
['password:', 1, EXP_REGEXP],
['\$', 2, EXP_GLOB],
])) {
case 1:
fwrite($stream, "meinGeheimesPasswort\n");
echo "Passwort gesendet.\n";
break;
case 2:
echo "Bereits eingeloggt.\n";
break;
case EXP_TIMEOUT:
echo "Timeout: Keine Antwort erhalten.\n";
break;
case EXP_EOF:
echo "EOF: Verbindung wurde beendet.\n";
break;
}
fclose($stream);
Gematchten Text über $match auslesen
<?php
ini_set('expect.timeout', 5);
$stream = expect_popen('php -r "echo \"Hallo Welt\";"');
$match = [];
$ret = expect_expectl($stream, [
['Hallo (\w+)', 1, EXP_REGEXP],
], $match);
if ($ret === 1) {
echo 'Gesamtmatch: ' . $match[0] . PHP_EOL;
echo 'Gruppe 1: ' . $match[1] . PHP_EOL;
} elseif ($ret === EXP_TIMEOUT) {
echo 'Timeout erreicht.' . PHP_EOL;
}
fclose($stream);
// Wichtig · Fallstricke
Sicherheitshinweis: Passwörter oder sensible Daten sollten niemals hartcodiert im Skript stehen. Verwende Umgebungsvariablen oder sichere Konfigurationsdateien.
Die Expect-Erweiterung ist nicht standardmäßig in PHP enthalten und muss separat über PECL installiert werden (pecl install expect). Sie ist außerdem nur auf Unix-ähnlichen Systemen verfügbar.
EXP_TIMEOUT und EXP_EOF sind vordefinierte Konstanten der Erweiterung und sollten immer als Fallback-Fälle behandelt werden, um hängende Skripte zu vermeiden.
Der Timeout-Wert kann global über ini_set('expect.timeout', Sekunden) oder pro Prozess konfiguriert werden. Ein Wert von -1 deaktiviert den Timeout vollständig.