Start · Sprachen · PHP · Referenz · expect_expectl

expect_expectl

Funktion

Wartet, bis die Ausgabe eines Prozesses auf ein Muster passt, eine Zeit verstreicht oder EOF erreicht wird.

Kategorie: misc

Signatur

expect_expectl(resource $expect, array $cases, array &$match = []): int

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

Typ
int
Beschreibung
Gibt den Rückgabewert des passenden $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);
Passwort gesendet.

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);
Gesamtmatch: Hallo Welt Gruppe 1: Welt

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