Start · Sprachen · PHP · Referenz · expect://

expect://

Funktion

Stream-Wrapper, der über die Expect-Erweiterung interaktive Prozesse steuert und deren Ein-/Ausgabe als Stream zugänglich macht.

Kategorie: misc

Signatur

expect://command

Beschreibung

Der expect://-Stream-Wrapper ist Teil der PECL-Erweiterung Expect und ermöglicht die Interaktion mit interaktiven Prozessen (z. B. SSH, FTP, Passwortabfragen) über PTY (Pseudo-Terminal). Der angegebene Befehl wird in einer Shell gestartet, und Ein- wie Ausgabe lassen sich über Standard-PHP-Stream-Funktionen lesen und schreiben.

Im Gegensatz zu proc_open() oder popen() öffnet expect:// ein echtes Pseudo-Terminal, was für Programme notwendig ist, die ein interaktives Terminal erwarten (z. B. passwd, ssh, sudo). Dadurch können Antworten auf Prompts automatisiert werden, ohne dass das Programm abbricht oder blockiert.

Typische Einsatzgebiete sind Deployments, automatisierte Systemadministration sowie Tests von CLI-Programmen, die Benutzereingaben erfordern. Die Erweiterung stellt zusätzlich Funktionen wie expect_expectl() bereit, mit denen auf bestimmte Ausgabemuster gewartet und dann gezielt geantwortet werden kann.

Voraussetzung ist die Installation der PECL-Erweiterung expect sowie der Systembibliothek libexpect. Der Wrapper steht nicht in der Standard-PHP-Distribution zur Verfügung.

Parameter

Name Typ Default Beschreibung
$command Pflicht string Der Shellbefehl, der in einem Pseudo-Terminal gestartet werden soll, z. B. expect://ssh user@host. Der Befehl wird an /bin/sh -c übergeben.

Rückgabewert

Typ
resource
Beschreibung
Gibt eine Stream-Ressource zurück, die mit Expect-Funktionen wie expect_expectl() sowie mit den Standard-Stream-Funktionen fwrite() und fread() verwendet werden kann. Bei Fehler wird false zurückgegeben.

Beispiele

Automatisierte SSH-Passwortanmeldung mit expect://

<?php
// Voraussetzung: PECL-Erweiterung 'expect' ist installiert

$stream = fopen('expect://ssh -o StrictHostKeyChecking=no user@remotehost', 'r+');

if ($stream === false) {
    die('Konnte Expect-Stream nicht öffnen.');
}

// Warten auf den Passwort-Prompt
$cases = [
    [0, 'password:', EXP_EXACT],
];

$match = expect_expectl($stream, $cases);

if ($match === 0) {
    // Passwort senden
    fwrite($stream, "geheimesPasswort\n");

    // Warten auf Shell-Prompt
    $cases2 = [
        [1, '$', EXP_EXACT],
    ];
    expect_expectl($stream, $cases2);

    // Befehl ausführen
    fwrite($stream, "uptime\n");

    // Ausgabe lesen
    $output = fread($stream, 4096);
    echo $output;
} else {
    echo 'Unerwartete Ausgabe vom Prozess.';
}

fclose($stream);
10:42:01 up 3 days, 2:15, 1 user, load average: 0.01, 0.05, 0.00

Interaktive sudo-Eingabe automatisieren

<?php
// Expect-Erweiterung erforderlich

$stream = fopen('expect://sudo -S whoami', 'r+');

if (!$stream) {
    die('Stream konnte nicht geöffnet werden.');
}

$cases = [
    [0, '[sudo] password', EXP_GLOB],
    [1, EXP_TIMEOUT, EXP_TIMEOUT],
];

$result = expect_expectl($stream, $cases);

if ($result === 0) {
    fwrite($stream, "meinSudoPasswort\n");
    sleep(1);
    $out = fread($stream, 256);
    echo trim($out); // Gibt z. B. 'root' aus
}

fclose($stream);
root

// Wichtig · Fallstricke

Sicherheitshinweis: Passwörter sollten niemals hart codiert im Quellcode stehen. Verwende Umgebungsvariablen oder sichere Konfigurationsspeicher. Logge niemals die an den Stream gesendeten Daten, da diese sensible Anmeldeinformationen enthalten können.

Verfügbarkeit: expect:// ist kein eingebauter PHP-Wrapper, sondern erfordert die PECL-Erweiterung expect (z. B. pecl install expect) sowie libexpect-dev auf dem System.

Alternativen: Für SSH empfiehlt sich in Produktionsumgebungen die Verwendung von Public-Key-Authentifizierung in Kombination mit phpseclib oder der PECL-Erweiterung ssh2, die robuster und sicherer sind.

Auf Windows-Systemen steht dieser Wrapper nicht zur Verfügung, da PTY-Unterstützung fehlt.