Signatur
Beschreibung
Der ssh2://-Wrapper ist ein URL-Stream-Wrapper, der es erlaubt, über das SSH2-Protokoll auf entfernte Dateisysteme und Befehle zuzugreifen. Er gehört zur PECL-Erweiterung ssh2 (ext/ssh2) und muss daher gesondert installiert sein. Über diesen Wrapper können Standard-PHP-Dateifunktionen wie file_get_contents(), file_put_contents(), fopen() usw. auf SSH2-Ressourcen angewendet werden.
Die URL-Syntax lautet allgemein: ssh2.sftp://ressource/pfad für SFTP-Zugriff oder ssh2.exec://ressource/befehl für die Befehlsausführung. Häufig wird zunächst eine SSH2-Verbindungsressource über ssh2_connect() erstellt, authentifiziert und dann als Stream-Kontext oder direkt als Ressource an den Wrapper übergeben.
Der Wrapper unterstützt verschiedene Unterprotokolle: ssh2.exec:// für die Ausführung von Befehlen, ssh2.tunnel:// für TCP-Tunnel, ssh2.sftp:// für SFTP-Dateioperationen und ssh2.scp:// für SCP-Dateiübertragungen. Je nach Anwendungsfall wird das passende Unterprotokoll gewählt.
Da für alle Operationen eine authentifizierte SSH2-Verbindungsressource benötigt wird, ist der typische Arbeitsablauf: Verbindung herstellen mit ssh2_connect(), Authentifizierung durchführen (z. B. mit ssh2_auth_password() oder ssh2_auth_pubkey_file()) und dann den zurückgegebenen Ressource-Zeiger für den Wrapper nutzen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $host Pflicht | string | Hostname oder IP-Adresse des SSH2-Servers. | |
| $port | int | 22 | Port des SSH2-Servers; standardmäßig 22. |
| $user Pflicht | string | Benutzername für die SSH2-Authentifizierung. | |
| $password | string | Passwort für die Passwort-Authentifizierung. Für Public-Key-Authentifizierung wird stattdessen ssh2_auth_pubkey_file() verwendet. |
|
| $path | string | Pfad zur Datei auf dem entfernten System (bei ssh2.sftp://) oder auszuführender Befehl (bei ssh2.exec://). |
Rückgabewert
false bei einem Fehler.Beispiele
SFTP-Datei lesen mit ssh2.sftp://
<?php
// PECL ssh2-Erweiterung muss installiert sein
$verbindung = ssh2_connect('example.com', 22);
if (!$verbindung) {
die('Verbindung fehlgeschlagen');
}
// Passwort-Authentifizierung
if (!ssh2_auth_password($verbindung, 'benutzer', 'geheimesPasswort')) {
die('Authentifizierung fehlgeschlagen');
}
// SFTP-Subsystem initialisieren
$sftp = ssh2_sftp($verbindung);
// Datei über den Wrapper lesen
$inhalt = file_get_contents('ssh2.sftp://' . intval($sftp) . '/var/www/html/index.php');
echo $inhalt;
Befehl auf entferntem Server ausführen mit ssh2.exec://
<?php
$verbindung = ssh2_connect('example.com', 22);
ssh2_auth_password($verbindung, 'benutzer', 'geheimesPasswort');
// Befehl auf dem entfernten Server ausführen
$stream = ssh2_exec($verbindung, 'ls -la /var/www/');
stream_set_blocking($stream, true);
$ausgabe = stream_get_contents($stream);
fclose($stream);
echo $ausgabe;
Datei per SFTP hochladen
<?php
$verbindung = ssh2_connect('example.com', 22);
ssh2_auth_pubkey_file(
$verbindung,
'benutzer',
'/home/benutzer/.ssh/id_rsa.pub',
'/home/benutzer/.ssh/id_rsa'
);
$sftp = ssh2_sftp($verbindung);
// Lokale Datei auf den entfernten Server hochladen
$lokaleInhalt = 'Hallo, SSH2-Welt!';
file_put_contents(
'ssh2.sftp://' . intval($sftp) . '/tmp/test.txt',
$lokaleInhalt
);
echo 'Datei erfolgreich hochgeladen.';
// Wichtig · Fallstricke
Sicherheitshinweise:
- Passwörter sollten niemals im Klartext in URL-Strings hart kodiert werden. Nutze statt dessen Umgebungsvariablen oder sichere Konfigurationsdateien.
- Bevorzuge die Public-Key-Authentifizierung (
ssh2_auth_pubkey_file()) gegenüber der Passwort-Authentifizierung. - Überprüfe den Fingerabdruck des Host-Schlüssels mit
ssh2_fingerprint(), um Man-in-the-Middle-Angriffe zu verhindern. - Der Wrapper erfordert die PECL-Erweiterung ssh2, die nicht standardmäßig in PHP enthalten ist und separat installiert werden muss (
pecl install ssh2). - Bei der Verwendung von
intval($sftp)als Teil der URL wird die numerische Ressource-ID der SFTP-Verbindung genutzt — dieses Verfahren ist ein gängiger Workaround, da direkte Ressource-Objekte nicht in URLs eingebettet werden können. - Ab PHP 8.0 werden Ressourcen-IDs als Integerwerte verwendet; das Casting mit
(int)bleibt aber kompatibel.