Start · Sprachen · PHP · Referenz · ssh2_disconnect

ssh2_disconnect

Funktion

Schließt eine aktive SSH2-Verbindung zu einem entfernten Server und gibt alle zugehörigen Ressourcen frei.

seit PHP 0.9.0 Kategorie: http

Signatur

ssh2_disconnect(resource $session): bool

Beschreibung

ssh2_disconnect() beendet eine SSH2-Sitzung, die zuvor mit ssh2_connect() aufgebaut wurde. Die Funktion sendet das entsprechende SSH-Trennungspaket an den Server und gibt intern verwendete Ressourcen frei. Sie sollte am Ende jeder SSH-Verbindung aufgerufen werden, um sauber zu trennen.

Die Funktion gehört zur PECL-Erweiterung ssh2 und ist daher nicht in der Standard-PHP-Distribution enthalten. Sie muss über PECL installiert und in der php.ini aktiviert sein (extension=ssh2.so).

Typische Einsatzszenarien sind die Ausführung von Remote-Befehlen, SFTP-Dateiübertragungen oder Tunnel-Verbindungen, nach deren Abschluss die Verbindung ordnungsgemäß geschlossen werden soll. Wird ssh2_disconnect() nicht aufgerufen, wird die Verbindung erst beim Ende des PHP-Skripts durch den Garbage Collector getrennt, was zu unnötig langen offenen Verbindungen auf dem Server führen kann.

Nach dem Aufruf von ssh2_disconnect() sollte die $session-Ressource nicht weiter verwendet werden, da sie ungültig wird. Jeder weitere Aufruf auf dieser Ressource führt zu einem PHP-Fehler.

Parameter

Name Typ Default Beschreibung
$session Pflicht resource Eine gültige SSH2-Sitzungs-Ressource, wie sie von ssh2_connect() zurückgegeben wird.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Verbindung erfolgreich getrennt wurde, andernfalls false.

Beispiele

Einfache SSH2-Verbindung herstellen und sauber trennen

<?php
// SSH2-Verbindung zum Server aufbauen
$session = ssh2_connect('example.com', 22);

if (!$session) {
    die('Verbindung zum SSH-Server fehlgeschlagen.');
}

// Authentifizierung mit Benutzername und Passwort
if (!ssh2_auth_password($session, 'benutzer', 'geheimesPasswort')) {
    die('Authentifizierung fehlgeschlagen.');
}

// Remote-Befehl ausführen
$stream = ssh2_exec($session, 'uname -a');
stream_set_blocking($stream, true);
$output = stream_get_contents($stream);
fclose($stream);

echo 'Ergebnis: ' . $output . PHP_EOL;

// Verbindung sauber trennen
if (ssh2_disconnect($session)) {
    echo 'Verbindung erfolgreich getrennt.' . PHP_EOL;
} else {
    echo 'Fehler beim Trennen der Verbindung.' . PHP_EOL;
}
?>
Ergebnis: Linux example.com 5.15.0-91-generic #101-Ubuntu SMP ... Verbindung erfolgreich getrennt.

SFTP-Dateiübertragung mit anschließendem Disconnect

<?php
$session = ssh2_connect('example.com', 22);

if (!$session) {
    die('Verbindung fehlgeschlagen.');
}

// Authentifizierung per Public-Key
if (!ssh2_auth_pubkey_file(
    $session,
    'benutzer',
    '/home/user/.ssh/id_rsa.pub',
    '/home/user/.ssh/id_rsa'
)) {
    die('Authentifizierung per Public-Key fehlgeschlagen.');
}

// SFTP-Subsystem initialisieren
$sftp = ssh2_sftp($session);

if (!$sftp) {
    ssh2_disconnect($session);
    die('SFTP-Initialisierung fehlgeschlagen.');
}

// Datei hochladen
$localFile  = '/tmp/upload.txt';
$remoteFile = 'ssh2.sftp://' . intval($sftp) . '/home/benutzer/upload.txt';

if (file_put_contents($remoteFile, file_get_contents($localFile)) !== false) {
    echo 'Datei erfolgreich hochgeladen.' . PHP_EOL;
} else {
    echo 'Fehler beim Hochladen der Datei.' . PHP_EOL;
}

// Verbindung immer sauber trennen
ssh2_disconnect($session);
echo 'SSH-Sitzung beendet.' . PHP_EOL;
?>
Datei erfolgreich hochgeladen. SSH-Sitzung beendet.

// Wichtig · Fallstricke

PECL-Abhängigkeit: ssh2_disconnect() ist Teil der PECL-Erweiterung ssh2 und muss separat installiert werden (pecl install ssh2). Ohne diese Erweiterung ist die Funktion nicht verfügbar.

Ressourcen-Verwaltung: Nach dem Aufruf von ssh2_disconnect() ist die Sitzungs-Ressource ungültig. Jeder weitere Zugriff auf $session führt zu einer PHP-Warnung oder einem Fatal Error. Es empfiehlt sich, die Variable nach dem Disconnect auf null zu setzen ($session = null;).

Offene Streams: Alle über diese Sitzung geöffneten Streams (z. B. durch ssh2_exec() oder ssh2_sftp()) sollten vor dem Aufruf von ssh2_disconnect() mit fclose() geschlossen werden, um Datenverlust oder undefiniertes Verhalten zu vermeiden.