Signatur
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
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ü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.';
}
// 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
ssh2wird nicht von allen Hosting-Umgebungen unterstützt. Alternativ kannphpseclibals 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.