Signatur
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
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);
?>
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);
?>
// 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.