Start · Sprachen · PHP · Referenz · ssh2_scp_recv

ssh2_scp_recv

Funktion

Lädt eine Datei vom Remote-Server per SCP auf das lokale Dateisystem herunter.

seit PHP 0.9.0 Kategorie: http

Signatur

ssh2_scp_recv(resource $session, string $remote_file, string $local_file): bool

Beschreibung

ssh2_scp_recv() überträgt eine Datei vom entfernten SSH-Server auf das lokale System mittels des SCP-Protokolls (Secure Copy Protocol). Die Funktion ist Teil der SSH2-Erweiterung (PECL ssh2) und setzt eine bestehende, authentifizierte SSH-Verbindung voraus, wie sie z. B. von ssh2_connect() und ssh2_auth_password() geliefert wird.

SCP ist ein einfaches, sicheres Dateiübertragungsprotokoll, das SSH als Transport nutzt. Im Gegensatz zu SFTP bietet SCP keine Verzeichnisoperationen oder Dateiattribut-Verwaltung, ist aber für einfache Dateiübertragungen schnell und unkompliziert einzusetzen.

Der Pfad remote_file muss den vollständigen, absoluten Pfad der Quelldatei auf dem Server angeben. Der Pfad local_file gibt an, wohin die Datei auf dem lokalen System gespeichert werden soll – das Verzeichnis muss beschreibbar sein. Existiert die Zieldatei bereits, wird sie überschrieben.

Sinnvoll eingesetzt wird diese Funktion etwa beim automatisierten Abrufen von Log-Dateien, Backups oder Konfigurationsdateien von entfernten Servern in PHP-Skripten oder CLI-Tools.

Parameter

Name Typ Default Beschreibung
$session Pflicht resource Eine aktive SSH2-Verbindungsressource, die zuvor mit ssh2_connect() erstellt und authentifiziert wurde.
$remote_file Pflicht string Absoluter Pfad zur Quelldatei auf dem entfernten SSH-Server, z. B. /var/log/app.log.
$local_file Pflicht string Lokaler Dateipfad, unter dem die heruntergeladene Datei gespeichert wird, z. B. /tmp/app.log. Das Zielverzeichnis muss existieren und beschreibbar sein.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn die Datei erfolgreich übertragen wurde. Bei einem Fehler (z. B. Datei nicht vorhanden, fehlende Berechtigungen, Verbindungsprobleme) wird false zurückgegeben.

Beispiele

Log-Datei vom Server herunterladen

<?php
// SSH-Verbindung herstellen
$connection = ssh2_connect('example.com', 22);
if (!$connection) {
    die('Verbindung zum Server fehlgeschlagen.');
}

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

// Datei per SCP herunterladen
$remote = '/var/log/app/error.log';
$local  = '/tmp/error.log';

if (ssh2_scp_recv($connection, $remote, $local)) {
    echo "Datei erfolgreich heruntergeladen nach: $local" . PHP_EOL;
} else {
    echo "Fehler beim Herunterladen der Datei." . PHP_EOL;
}
?>
Datei erfolgreich heruntergeladen nach: /tmp/error.log

SCP-Download mit Schlüssel-Authentifizierung

<?php
$connection = ssh2_connect('backup.example.com', 22);
if (!$connection) {
    die('Verbindung fehlgeschlagen.');
}

// Public-Key-Authentifizierung
if (!ssh2_auth_pubkey_file(
    $connection,
    'backup-user',
    '/home/www/.ssh/id_rsa.pub',
    '/home/www/.ssh/id_rsa'
)) {
    die('SSH-Schlüsselauthentifizierung fehlgeschlagen.');
}

$remoteBackup = '/backups/db_2024-01-15.sql.gz';
$localTarget  = '/var/www/restores/db_2024-01-15.sql.gz';

if (ssh2_scp_recv($connection, $remoteBackup, $localTarget)) {
    echo 'Backup erfolgreich abgerufen.' . PHP_EOL;
    echo 'Dateigröße: ' . filesize($localTarget) . ' Bytes' . PHP_EOL;
} else {
    echo 'SCP-Übertragung fehlgeschlagen.' . PHP_EOL;
}
?>
Backup erfolgreich abgerufen. Dateigröße: 204800 Bytes

// Wichtig · Fallstricke

Voraussetzung: Die PECL-Erweiterung ssh2 muss installiert und in der php.ini geladen sein (extension=ssh2.so). Sie ist nicht standardmäßig in PHP enthalten.

Sicherheitshinweis: Speichere Passwörter und private Schlüssel niemals hartcodiert im Quellcode. Verwende Umgebungsvariablen oder sichere Konfigurationsdateien außerhalb des Web-Roots.

Pfade prüfen: Stelle sicher, dass local_file auf ein beschreibbares Verzeichnis zeigt und der PHP-Prozess entsprechende Dateisystemrechte besitzt. Ein relativer Pfad kann zu unerwarteten Speicherorten führen.

Alternativen: Für komplexere Szenarien (Verzeichnislisting, Attribute, partielle Übertragungen) sollte ssh2_sftp() in Kombination mit den SFTP-Funktionen verwendet werden. Für einfache Skripte kann auch der CLI-Befehl scp über exec() aufgerufen werden, was jedoch eigene Sicherheitsrisiken birgt.