Signatur
Beschreibung
ssh2_forward_accept() wird eingesetzt, um eine eingehende Portweiterleitung über eine bestehende SSH-Verbindung anzunehmen. Nachdem mit ssh2_forward_listen() ein Listener auf dem entfernten Server eingerichtet wurde, wartet diese Funktion auf eine tatsächliche Verbindungsanfrage und gibt einen Stream zurück, über den Daten ausgetauscht werden können.
Der zurückgegebene Stream verhält sich wie ein normaler PHP-Stream: Lese- und Schreiboperationen mit fread(), fwrite() und ähnlichen Funktionen sind möglich. Auf diese Weise lässt sich ein sicherer SSH-Tunnel transparent in PHP-Anwendungen integrieren, ohne direkt mit Sockets arbeiten zu müssen.
Typischerweise wird ssh2_forward_accept() in einer Schleife aufgerufen, um mehrere Verbindungen nacheinander anzunehmen, ähnlich wie socket_accept() bei nativen Sockets. Die Funktion blockiert, bis eine Verbindung eingeht, sofern der Stream nicht in den nicht-blockierenden Modus versetzt wurde.
Diese Funktion gehört zur PECL-Erweiterung ssh2 und setzt eine aktive SSH-Verbindung (erzeugt mit ssh2_connect()) sowie einen aktiven Listener (erzeugt mit ssh2_forward_listen()) voraus.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $listener Pflicht | resource | Ein Listener-Ressource, wie sie von ssh2_forward_listen() zurückgegeben wird. Repräsentiert den lauschenden Tunnel auf dem entfernten SSH-Server. |
Rückgabewert
false zurückgegeben.Beispiele
SSH-Portweiterleitung annehmen und Daten lesen
<?php
// SSH-Verbindung aufbauen
$connection = ssh2_connect('ssh.example.com', 22);
if (!$connection) {
die('Verbindung zum SSH-Server fehlgeschlagen.');
}
// Authentifizierung
ssh2_auth_password($connection, 'benutzer', 'passwort');
// Listener auf Port 8080 des entfernten Servers erstellen
$listener = ssh2_forward_listen($connection, 8080);
if (!$listener) {
die('Listener konnte nicht erstellt werden.');
}
echo "Warte auf eingehende Verbindungen auf Port 8080...\n";
// Eingehende Verbindung annehmen
$channel = ssh2_forward_accept($listener);
if ($channel === false) {
die('Keine Verbindung angenommen.');
}
echo "Verbindung angenommen. Lese Daten...\n";
// Daten vom Kanal lesen
$data = fread($channel, 4096);
echo "Empfangene Daten: " . $data . "\n";
// Antwort senden
fwrite($channel, "HTTP/1.0 200 OK\r\nContent-Length: 5\r\n\r\nHello");
// Kanal schließen
fclose($channel);
Schleife zum Annehmen mehrerer Verbindungen
<?php
$connection = ssh2_connect('ssh.example.com', 22);
ssh2_auth_password($connection, 'benutzer', 'passwort');
$listener = ssh2_forward_listen($connection, 9090);
if (!$listener) {
die('Listener konnte nicht erstellt werden.');
}
echo "Lausche auf Port 9090...\n";
while (true) {
$channel = ssh2_forward_accept($listener);
if ($channel === false) {
echo "Fehler beim Annehmen der Verbindung. Weiter...\n";
continue;
}
$request = fread($channel, 2048);
echo "Anfrage erhalten: " . substr($request, 0, 100) . "\n";
fwrite($channel, "Daten empfangen.\n");
fclose($channel);
}
// Wichtig · Fallstricke
Abhängigkeit: Diese Funktion setzt die PECL-Erweiterung ssh2 (libssh2) voraus, die nicht standardmäßig in PHP enthalten ist und separat installiert werden muss.
Blockierendes Verhalten: Standardmäßig blockiert ssh2_forward_accept(), bis eine Verbindung eingeht. In produktiven Anwendungen sollte geprüft werden, ob der Stream in den nicht-blockierenden Modus versetzt werden kann oder ob Timeouts konfiguriert werden müssen.
Sicherheit: SSH-Portweiterleitungen erlauben das Tunneln beliebiger Verbindungen. Es sollte sorgfältig geprüft werden, welche Ports und Dienste über einen Tunnel erreichbar gemacht werden, um ungewollte Angriffsvektoren zu vermeiden.
Ressourcen: Geöffnete Kanäle und Listener sollten nach der Nutzung mit fclose() geschlossen werden, um Ressourcenlecks zu vermeiden.