Linux-SCP-Befehl
SCP ist das klassische Tool, um unter Linux und POSIX-kompatiblen Betriebssystemen Dateien zwischen Maschinen im Netzwerk verschlüsselt zu kopieren. Dabei steht die Abkürzung SCP für Secure Copy („sicheres Kopieren“), wobei „sicher“ auf die zum Einsatz kommende Verschlüsselung des Datentransfers verweist. Der Name des SCP-Protokolls ist abgeleitet von den beiden zugrundeliegenden Technologien:
- dem SSH-Protokoll (Secure Shell), das den verschlüsselten Zugriff auf entfernte Systeme ermöglicht;
- dem RCP-Tool (Remote Copy), das unsicher, d. h. ohne Verschlüsselung, Dateien im Netzwerk kopiert.
Beim SCP-Befehl handelt es sich um eine Software, die auf dem lokalen System und dem Server läuft. Dabei fungiert das Tool als Daemon und Client für das SCP-Protokoll. Da SCP Teil der breitflächig eingesetzten OpenSSH-Distribution ist, steht es auf so gut wie allen Systemen zur Verfügung. Der Einsatz des SCP-Befehls erfolgt wie bei Linux üblich auf der Kommandozeile.
Einer der gravierenden Nachteile des SCP-Protokolls ist, dass die Software organisch gewachsen ist. Es existiert weder eine Standardisierung noch ein beschreibendes RFC-Dokument oder eine ähnliche Spezifikation. Stattdessen liegt lediglich eine Referenz-Implementierung als Teil des OpenSSH-Projekts vor. Heutzutage gibt es moderne Alternativen zu SCP, die für die meisten Anwendungsfälle bevorzugt werden.
Funktionalität und Nutzung des Linux-SCP-Befehls
Die Funktionalität des SCP-Befehls ist analog zum älteren RCP-Befehl. Wie bei RCP folgt die SCP-Syntax auf der Kommandozeile dem CP-Befehl, mit dem Dateien auf dem lokalen System kopiert werden. Da SCP auf dem SSH-Protokoll aufsetzt, läuft die Netzwerkkommunikation über den TCP-Port 22. Hier eine Übersicht gebräuchlicher Linux-Befehle zum Kopieren von Dateien:
Kopierbefehl | Name | Funktionalität | Remote-Zugriff |
cp | Copy | Kopie, nur lokal | - |
rcp | Remote Copy | Kopie lokal-remote, remote-remote | RSH |
scp | Secure Copy | Sichere Kopie lokal-remote, remote-remote | SSH |
sftp | Secure File Transfer Protocol | Sichere Kopie lokal-remote, remote-remote; Manipulation entfernter Dateisysteme | SSH |
rsync | Remote Sync | Sichere Kopie lokal, lokal-remote, remote-remote; Synchronisierung | SSH, Stunnel |
Mit SCP kann man eine Datei auf einen Server kopieren bzw. von einem Server herunterladen. Das Protokoll erlaubt lediglich einen unidirektionalen Datenfluss; das bedeutet, dass man pro Verbindung nur in eine Richtung kopieren kann. Ferner ist es mit SCP möglich, Dateien zwischen zwei Systemen im Netzwerk zu kopieren. Optional lassen sich bei allen Kopiervorgängen die Datei-Attribute der Quelldatei auf die Zieldatei übertragen.
Datenfluss beim Kopieren zwischen zwei entfernten Systemen
Möchte man unter Linux mit SCP eine Datei zwischen zwei entfernten Systemen kopieren, gibt es einige Besonderheiten zu beachten. SCP nutzt das SSH-Protokoll, um verschlüsselte Verbindungen aufzubauen. Der Zugriff auf ein entferntes System mit SSH erfolgt entweder mit Nutzername und Passwort oder mit SSH-Keys (öffentlichem/privatem Schlüsselpaar). Generell ist die private der öffentlichen Methode vorzuziehen.
In der ursprünglichen Variante, in der mit SCP eine Datei von einem entfernten System (Host) auf einen anderen Host übertragen wird, läuft der folgende Prozess ab:
- Der Nutzer weist das SCP-Tool auf seinem lokalen System an, eine Datei, die sich auf Host 1 befindet, auf Host 2 zu übertragen.
- Das SCP-Programm auf dem lokalen System des Nutzers öffnet eine SSH-Verbindung zu Host 1 und führt das dort befindliche SCP-Programm aus.
- Das SCP-Programm auf Host 1 öffnet eine SSH-Verbindung zu Host 2 und überträgt die auf Host 1 gespeicherte Datei wie eine lokale Datei an Host 2.
Damit dieser Ablauf funktionieren kann, muss ein öffentlicher SSH-Schlüssel von Host 1 auf Host 2 hinterlegt sein. Ist dies der Fall, besteht jedoch ein dauerhafter Zugriff von Host 1 auf Host 2 ohne Zutun des Nutzers, was ein Sicherheitsrisiko darstellt. Daher gibt es eine modernere Variante:
- Der Nutzer weist das SCP-Tool auf seinem lokalen System an, eine Datei, die sich auf Host 1 befindet, auf Host 2 zu übertragen.
- SCP öffnet jeweils eine SSH-Verbindung zu Host 1 und Host 2.
- Die Datei wird von Host 1 über das lokale System geleitet und zu Host 2 übertragen.
In diesem Fall müssen die öffentlichen SSH-Schlüssel des Nutzers auf Host 1 und Host 2 hinterlegt sein. In vielen Anwendungsszenarien dürfte dies ohnehin gegeben sein, z. B. wenn es sich beim Nutzer um einen Administrator handelt, der Zugriff auf beide Hosts hat.
Syntax des Linux-SCP-Befehls
Die Syntax eines Kommandozeilenbefehls definiert, wie der Befehl eingegeben werden muss, um korrekt ausgeführt werden zu können. Wir zeigen die Syntax des SCP-Befehls hier schematisch. Das grundlegende Muster bei der Nutzung des SCP-Befehls orientiert sich an der Syntax des CP-Befehls, der zum Kopieren von Dateien auf dem lokalen System zum Einsatz kommt: eine unter einem Quellpfad befindliche Datei wird zu einem Zielpfad kopiert. Dabei können dem Quellpfad nach Bedarf einige Optionen vorangestellt werden:
scp <Optionen> <Quellpfad> <Zielpfad>
Um Dateien von, zu oder zwischen entfernten Systemen zu kopieren, werden der Quell- oder der Zielpfad oder beide durch eine komplexere Pfadangabe ersetzt. Eine solche Pfadangabe enthält den Netzwerknamen bzw. die IP-Adresse des Hosts sowie den Namen des Nutzers, der auf den Host zugreifen möchte:
<Nutzer>@<Host>:<Verzeichnis/Datei.Endung>
Wir stellen im Folgenden die '<Nutzer>@<Host>'-Angabe beispielhaft als 'nutzer@example.com' (für Host 1) bzw. 'nutzer@www.example.com' (für Host 2) dar.
Optionen des Linux-SCP-Befehls
Wie bei Kommandozeilen-Tools üblich, wird die Funktionsweise des SCP-Befehls über verschiedene Optionen gesteuert. Wir zeigen hier eine Auswahl der nützlichsten Optionen:
Option | Bedeutung | Kommentar |
-C | Kompression nutzen (compression) | Nicht mit Option '-c' (cipher) verwechseln, die Verschlüsselungsverfahren setzt |
-p | Datei-Attribute auf Zieldateien übertragen (permissions) | Nicht mit Option '-P' verwechseln, die den Netzwerk-Port setzt |
-r | Verzeichnisse rekursiv kopieren (recursive) | - |
-v | Erweiterte Ausgabe anzeigen (verbose) | - |
-q | Ausgabe unterdrücken (quiet) | - |
-3 | Daten durch lokales System senden (third party) | - |
Für eine ausführliche Beschreibung aller verfügbaren Optionen greifen Sie auf die Manpage des SCP-Befehls zurück.
Beispiele für die Nutzung des Linux-SCP-Befehls
Der SCP-Befehl ist vielfältig einsetzbar und lässt sich auf der Kommandozeile mit den bekannten Mustern zur Angabe von Dateien und Verzeichnissen kombinieren. Angesichts der Breite der möglichen Einsatzszenarien präsentieren wir hier nur einige typische Fälle. Beachten Sie, dass heutzutage andere Tools dem SCP-Befehl vorgezogen werden, um Dateien im Netzwerk zu kopieren.
Eine Datei vom lokalen zum entfernten System kopieren
Um eine Datei 'datei.txt' vom aktuellen Verzeichnis im lokalen System auf den Host 'example.com' zu kopieren, nutzen wir den folgenden SCP-Aufruf. Beachten Sie, dass wir hier simulieren, als Nutzer mit Namen 'nutzer' Login-Zugriff auf den Host 'example.com' zu haben.
scp datei.txt nutzer@example.com:/pfad/zum/verzeichnis
Nach erfolgreichem Kopiervorgang befindet sich auf dem Host im Verzeichnis '/pfad/zum/verzeichnis' die Datei 'datei.txt'.
Eine Datei vom entfernten zum lokalen System kopieren
Um die Richtung des Kopiervorgangs umzudrehen, vertauschen wir einfach den lokalen und den entfernten Pfad. Im ersten Beispiel nutzen wir den Punkt '.', um als Ziel das aktuelle Verzeichnis anzugeben:
scp nutzer@example.com:/pfad/zum/verzeichnis/datei.txt
Hier zeigen wir eine Abwandlung des ersten Beispiels und kopieren die Datei in den Ordner 'Desktop' im Nutzerordner, wobei dieser durch die Tilde '~' symbolisiert wird. Beachten Sie bei Nutzung der Tilde, dass dabei der lokale Benutzerordner substituiert wird. Um Fehlern vorzubeugen, sollte ein Pfad mit Tilde von Anführungszeichen umschlossen sein:
scp nutzer@example.com:/pfad/zum/verzeichnis/datei.txt "~/Desktop/"
Möchten wir die Datei kopieren und unter einem anderen Namen speichern, geben wir den neuen Namen am Ende des Zielpfads an:
scp nutzer@example.com:/pfad/zum/verzeichnis/datei.txt "~/Desktop/datei.bak"
Mehrere Dateien kopieren
Sofern Ihnen die Nutzung des CP-Befehls geläufig ist, vermuten Sie vielleicht bereits, dass wir mit dem SCP-Befehl auch mehrere Dateien kopieren können. Der einfachste Weg, dies zu tun, besteht darin, die Dateien einzeln aufzulisten. Im folgenden Beispiel befinden sich die angegebenen Dateien im aktuellen Verzeichnis; wir sparen uns daher die Angabe des Pfads zu jeder einzelnen Datei:
scp datei-1.txt datei-2.txt nutzer@example.com:/pfad/zum/verzeichnis
Vorsicht gilt bei der Nutzung von „Wildcards“ und „Globs“ wie '?' und '*'. Auch wenn diese es komfortabel machen, Muster in Dateinamen kompakt wiederzugeben, können sie bei Nutzung im Host-Pfad zu unerwarteten Fehlern führen. Verwenden Sie in diesen Fällen besser eine Schleife, wie in unserem Beispiel „Dateien auf ein entferntes System verschieben“ gezeigt, oder greifen Sie auf ein alternatives Tool zurück.
Ein gesamtes Verzeichnis kopieren
Wie vom CP-Befehl gewohnt, kann rekursiv ein gesamtes Verzeichnis kopiert werden. Wir geben dafür vor dem Quellpfad die Option '-r' an.
scp -r verzeichnis nutzer@example.com:/pfad/zum/verzeichnis
Nach erfolgreicher Ausführung werden sich alle im Verzeichnis 'verzeichnis' befindlichen Dateien und Unterverzeichnisse als Kopie auf dem Host unter dem Pfad '/pfad/zum/verzeichnis' wiederfinden.
Zum Transfer größerer Dateien ist es sinnvoll, die Option '-C' zu nutzen, die die Dateien für den Transfer komprimiert:
scp -C -r verzeichnis nutzer@example.com:/pfad/zum/verzeichnis
Beachten Sie, dass SCP immer alle Dateien komplett transferiert. Bricht der Transfer ab, muss wieder ganz von vorne begonnen werden. Zum Kopieren großer Verzeichnisse oder bei wackeliger Netzwerkverbindung ist es sinnvoll, ein alternatives Tool einzusetzen.
Eine Datei zwischen zwei entfernten Systemen kopieren
Um eine Datei zwischen zwei Hosts zu kopieren, nutzen wir den SCP-Befehl ohne Angabe eines lokalen Pfads. Quell- und Zielpfad müssen die Angaben zu Nutzer und Host enthalten:
scp nutzer@example.com:/pfad/zum/verzeichnis/datei.txt nutzer@www.example.com:/pfad/zum/anderen/verzeichnis
Wie eingangs angemerkt, ist es oft besser, den Transfer über das eigene System zu leiten. Wir nutzen dafür die Option '-3', die dem Quellpfad vorangestellt wird:
scp -3 nutzer@example.com:/pfad/zum/verzeichnis/datei.txt nutzer@www.example.com:/pfad/zum/anderen/verzeichnis
Dateien auf ein entferntes System verschieben
Ein komplexeres Szenario für den Einsatz des SCP-Befehls ist das Verschieben lokaler Daten auf einen Host. Dies kann z. B. zum Einsatz kommen, um ein entferntes Backup lokal nicht weiter benötigter Dateien anzulegen. Analog zur Unterscheidung der lokalen Befehle 'cp' („Copy“, Kopieren) und 'mv' („Move“, Verschieben) bietet der SCP-Befehl keine eigenständige Option für das Verschieben einer Datei. Wir können dies jedoch mit gängigen Methoden einfach selbst realisieren.
Betrachten wir zunächst die Verschieben-Operation; diese setzt sich aus Kopieren und anschließendem Löschen zusammen. Diese Abfolge von Operationen realisieren wir auf der Kommandozeile durch Kombinieren der Befehle 'scp' und 'rm', wobei letzterer zum Löschen einer Linux-Datei dient. Wir verketten die Befehle mit dem logischen AND-Operator '&&', sodass der zweite Befehl nur dann ausgeführt wird, wenn der erste erfolgreich war. Somit stellen wir sicher, dass die Kopie auf dem Host angelegt wurde, bevor das lokale Original gelöscht wird.
Zu guter Letzt nutzen wir eine 'for'-Schleife, um alle im aktuellen Verzeichnis befindlichen Dateien zu prozessieren. Optional geben wir dabei ein Muster an, um nur bestimmte Dateien oder Dateitypen einzuschließen. Da wir ein exaktes Backup jeder einzelnen Datei anlegen möchten, nutzen wir die Option '-p', um auch die Dateiattribute zu kopieren. Da es sich beim Anlegen eines Backups um einen kritischen Prozess handelt, weisen wir den SCP-Befehl mit der Option '-v' an, zusätzliche Statusinformationen auszugeben.
for datei in ./muster*.endung ; do scp -p -v "$datei" nutzer@example.com:"/backup/${datei}.bak" && rm "$datei" ; done
Alternativen zum Linux-SCP-Befehl
Auch wenn SCP auf fast allen Systemen verfügbar ist, ist die Software längst nicht mehr die bevorzugte Methode, um Dateien im Netzwerk zu kopieren. Auf diesen Umstand weisen selbst die Entwickler des OpenSSH-Projekts hin, das SCP beherbergt.
Die von den SCP-Maintainern genannten Alternativen SFTP (Secure File Transfer Protocol) und Rsync (Remote Sync) nutzen ebenfalls SSH für den verschlüsselten Zugriff auf den entfernten Host. Beide Programme bieten einen höheren Umfang an Funktionalität und werden aktiv weiterentwickelt. Der einzige ernstzunehmende Nachteil dieser Tools ist, dass sie ggf. zunächst installiert werden müssen, wohingegen SCP auf so gut wie allen Systemen vorinstalliert ist. Schauen wir uns die beiden Alternativen etwas genauer an.
Bei SFTP handelt es sich quasi um den direkten Nachfolger von SCP. Der Datentransfer ist garantiert verschlüsselt und nutzt die bestehende SSH-Infrastruktur. Das bedeutet im praktischen Einsatz, dass mit SFTP auf die entfernten Dateisysteme von Hosts zugegriffen werden kann, für die vom lokalen System aus SSH-Zugriff besteht. Das SFTP-Protokoll bietet einen weitaus höheren Funktionsumfang als SCP. Transferierte Daten werden automatisch auf Korrektheit überprüft und abgebrochene Transfers lassen sich weiterführen.
Mit Rsync steht ein weiteres mächtiges Tool zur Verfügung, das alle Aufgaben von SCP übernehmen kann. Dabei handelt es sich bei Rsync nicht um einen Kopierbefehl im eigentlichen Sinne. Das Tool kann weitaus mehr und ist insbesondere für den effizienten Transfer großer Dateien und Datenmengen ausgelegt. Dazu vergleicht Rsync die auf Quelle und Ziel vorhandenen Daten und überträgt nur die Differenz. Bricht ein Transfer ab und wird neugestartet, muss nicht von vorne begonnen werden.
Sofern auf Ihrem System vorhanden, sollten Sie anstelle von SCP die Tools SFTP oder Rsync nutzen, um Dateien im Netzwerk zu kopieren.