Start · Sprachen · PHP · Referenz · ssh2_scp_send

ssh2_scp_send

Funktion

Überträgt eine lokale Datei per SCP (Secure Copy Protocol) über eine bestehende SSH-Verbindung auf einen Remote-Server.

seit PHP 0.9.0 Kategorie: http

Signatur

ssh2_scp_send(resource $session, string $local_file, string $remote_file, int $create_mode = 0644): bool

Beschreibung

ssh2_scp_send() sendet eine lokale Datei über das Secure Copy Protocol (SCP) an einen entfernten Server. Die Funktion setzt eine aktive SSH-Verbindung voraus, die zuvor mit ssh2_connect() aufgebaut und authentifiziert wurde. SCP ist eine einfache, auf SSH basierende Methode zum sicheren Übertragen von Dateien zwischen zwei Hosts.

Der Parameter $create_mode legt die Unix-Dateiberechtigungen (als oktaler Wert) für die neu erstellte Datei auf dem Remote-System fest. Typische Werte sind 0644 (lesbar für alle, schreibbar nur für den Eigentümer) oder 0600 (nur für den Eigentümer lesbar und schreibbar).

Die Funktion ist Teil der PECL-Erweiterung ssh2 und muss daher separat installiert werden (pecl install ssh2). Sie eignet sich besonders für einfache Dateiübertragungsaufgaben in Automatisierungs- oder Deployment-Skripten, bei denen keine vollständige SFTP-Sitzung benötigt wird.

  • Für komplexere Dateioperationen (Auflisten, Löschen, Umbenennen) empfiehlt sich stattdessen das SFTP-Subsystem über ssh2_sftp().
  • Die lokale Datei muss lesbar sein; die Remote-Seite muss Schreibrechte im Zielverzeichnis haben.

Parameter

Name Typ Default Beschreibung
$session Pflicht resource Eine aktive SSH-Verbindungsressource, die mit ssh2_connect() erstellt und erfolgreich authentifiziert wurde.
$local_file Pflicht string Vollständiger oder relativer Pfad zur lokalen Datei, die gesendet werden soll. Die Datei muss vorhanden und lesbar sein.
$remote_file Pflicht string Absoluter Pfad auf dem Remote-Server, unter dem die Datei gespeichert werden soll (z. B. /home/user/upload/datei.txt).
$create_mode int 0644 Dateiberechtigungen für die Remote-Datei als oktaler Wert (z. B. 0644 oder 0600). Wird im Unix-Stil angegeben.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, false bei einem Fehler (z. B. wenn die lokale Datei nicht lesbar ist, die Verbindung unterbrochen wurde oder keine Schreibrechte auf dem Remote-Server bestehen).

Beispiele

Einfache Dateiübertragung per SCP

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

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

// Lokale Datei per SCP auf den Server übertragen
$localFile  = '/var/www/builds/app.tar.gz';
$remoteFile = '/home/deploy/releases/app.tar.gz';

if (ssh2_scp_send($connection, $localFile, $remoteFile, 0644)) {
    echo 'Datei erfolgreich übertragen.';
} else {
    echo 'Fehler beim Übertragen der Datei.';
}
Datei erfolgreich übertragen.

Dateiübertragung mit SSH-Schlüsseln und restriktiven Berechtigungen

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

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

$localConfig  = '/etc/myapp/secrets.conf';
$remoteConfig = '/home/backupuser/secrets.conf';

// Datei nur für den Eigentümer lesbar/schreibbar übertragen
if (ssh2_scp_send($connection, $localConfig, $remoteConfig, 0600)) {
    echo 'Konfigurationsdatei sicher übertragen (Modus 0600).';
} else {
    echo 'Übertragung fehlgeschlagen.';
}
Konfigurationsdatei sicher übertragen (Modus 0600).

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Speichere SSH-Passwörter niemals direkt im Quellcode. Nutze stattdessen Umgebungsvariablen oder Secrets-Management-Lösungen.
  • Bevorzuge die Public-Key-Authentifizierung (ssh2_auth_pubkey_file()) gegenüber Passwort-Authentifizierung.
  • Überprüfe den Fingerprint des Remote-Servers mit ssh2_fingerprint(), um Man-in-the-Middle-Angriffe zu verhindern.
  • Die PECL-Erweiterung ssh2 wird nicht von allen Hosting-Umgebungen unterstützt. Alternativ kann phpseclib als Pure-PHP-Implementierung verwendet werden.
  • Bei sehr großen Dateien kann es zu Timeouts kommen — setze ggf. set_time_limit(0) und achte auf ausreichend Arbeitsspeicher.
  • ssh2_scp_send() blockiert, bis die Übertragung abgeschlossen ist oder ein Fehler auftritt; asynchrone Übertragungen sind nicht direkt möglich.