Start · Sprachen · PHP · Referenz · ssh2_send_eof

ssh2_send_eof

Funktion

Sendet ein EOF-Signal (End of File) an einen geöffneten SSH2-Kanal-Stream und signalisiert dem entfernten Ende, dass keine weiteren Daten gesendet werden.

seit PHP 0.9.0 Kategorie: http

Signatur

ssh2_send_eof(resource $channel): bool

Beschreibung

ssh2_send_eof() sendet ein EOF-Signal an einen SSH2-Kanal-Stream, der zuvor über Funktionen wie ssh2_exec(), ssh2_shell() oder ssh2_tunnel() geöffnet wurde. Das EOF-Signal teilt dem entfernten SSH-Server mit, dass von der Client-Seite keine weiteren Daten mehr auf diesem Kanal gesendet werden.

Diese Funktion ist besonders nützlich, wenn ein Remote-Befehl auf das Ende der Eingabe wartet (z. B. cat, wc oder ähnliche Unix-Werkzeuge, die von stdin lesen). Ohne das EOF-Signal würde der Remote-Prozess möglicherweise unbegrenzt auf weitere Eingabe warten und der Stream würde blockieren.

Nach dem Aufruf von ssh2_send_eof() kann der Kanal weiterhin zum Lesen verwendet werden – also um die Ausgabe des Remote-Prozesses zu empfangen – bis der Remote-Prozess ebenfalls beendet ist und der Stream geschlossen wird. Das Schreiben weiterer Daten in den Kanal nach dem EOF ist jedoch nicht mehr sinnvoll.

Die Funktion gehört zur PECL-Erweiterung ssh2 und erfordert, dass libssh2 installiert und die Erweiterung geladen ist.

Parameter

Name Typ Default Beschreibung
$channel Pflicht resource Ein geöffneter SSH2-Kanal-Stream, wie er von ssh2_exec(), ssh2_shell() oder ssh2_tunnel() zurückgegeben wird.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, false bei einem Fehler (z. B. wenn der übergebene Stream kein gültiger SSH2-Kanal ist oder das Signal nicht gesendet werden konnte).

Beispiele

Daten senden und EOF signalisieren (z. B. an cat-Befehl)

<?php
$connection = ssh2_connect('example.com', 22);
ssh2_auth_password($connection, 'benutzer', 'geheim');

// Remote-Befehl öffnen, der auf stdin wartet
$stream = ssh2_exec($connection, 'cat');

if ($stream === false) {
    die('Fehler beim Öffnen des SSH2-Kanals.');
}

stream_set_blocking($stream, true);

// Daten an den Remote-Prozess senden
fwrite($stream, "Hallo, SSH2!\n");
fwrite($stream, "Zweite Zeile\n");

// EOF senden, damit 'cat' weiß, dass keine weiteren Eingaben kommen
ssh2_send_eof($stream);

// Ausgabe des Remote-Prozesses lesen
$output = stream_get_contents($stream);
echo "Ausgabe vom Server:\n" . $output;

fclose($stream);
?>
Ausgabe vom Server: Hallo, SSH2! Zweite Zeile

Datei auf entferntem Server über stdin verarbeiten

<?php
$connection = ssh2_connect('example.com', 22);
ssh2_auth_publickey($connection, 'benutzer', '/home/user/.ssh/id_rsa.pub', '/home/user/.ssh/id_rsa');

// Zeilenanzahl einer übertragenen Eingabe per wc -l ermitteln
$stream = ssh2_exec($connection, 'wc -l');

if ($stream === false) {
    die('SSH2-Kanal konnte nicht geöffnet werden.');
}

stream_set_blocking($stream, true);

$localFile = file_get_contents('/pfad/zur/lokalen/datei.txt');
fwrite($stream, $localFile);

// EOF senden: wc -l wartet sonst endlos auf weitere Eingabe
$result = ssh2_send_eof($stream);
if ($result === false) {
    echo 'Fehler beim Senden des EOF-Signals.';
} else {
    $lines = trim(stream_get_contents($stream));
    echo "Anzahl Zeilen: " . $lines . "\n";
}

fclose($stream);
?>
Anzahl Zeilen: 42

// Wichtig · Fallstricke

PECL-Erweiterung: ssh2_send_eof() ist Teil der PECL-Erweiterung ssh2 und steht nicht standardmäßig in PHP zur Verfügung. Die Erweiterung muss separat installiert werden (pecl install ssh2).

Blocking-Modus: Achte darauf, den Stream-Blocking-Modus korrekt zu setzen (stream_set_blocking()), bevor du Daten liest oder schreibst. Im nicht-blockierenden Modus kann es zu unerwarteten Ergebnissen kommen, wenn der Remote-Prozess noch nicht abgeschlossen hat.

Reihenfolge: Rufe ssh2_send_eof() erst auf, nachdem alle Daten mit fwrite() in den Stream geschrieben wurden. Danach sollten keine weiteren Schreibvorgänge auf diesen Kanal erfolgen.