Dateien zwischen Linux-Rechnern über SSH übertragen
Übersicht
Manchmal möchten wir Dateien sicher von einem Linux-Rechner auf einen anderen übertragen. Vielleicht wollen wir einige Dateien auf einen Produktionsserver hochladen oder ein Backup erstellen.
In diesem Artikel sehen wir uns verschiedene Tools für die Übertragung von Dateien zwischen Linux-Rechnern über ssh an, das beliebteste Protokoll für Remote-Verbindungen zwischen Linux-Rechnern.
Wir sehen uns die beiden beliebtesten Dateiübertragungs-Tools an: scp und rsync.
Grundlegende Verwendung der Tools
2.1. Ein kurzes Beispiel
Stellen wir uns vor, wir wollen die Datei text.log von unserem lokalen System in den Pfad /var/log auf einem entfernten Linux-Server mit der IP-Adresse 111.111.111.111 kopieren, und zwar mit den Anmeldedaten des Benutzers root.
Dies kann mit scp oder rsync mit der gleichen grundlegenden Syntax erreicht werden:
scp text.log :/var/logrsync text.log :/var/log
Lassen Sie uns verstehen, was diese Befehle gemeinsam haben, bevor wir ihre Variationen und Unterschiede kennenlernen.
2.2. Die allgemeine Syntax
Die allgemeine Syntax für scp oder rsync lautet:
scp/rsync ]Source_File ]Destination_file
Der OPTION-Abschnitt erlaubt es uns, Befehlszeilenschalter zu verwenden, um das Verhalten des Kopiervorgangs zu ändern. Die beiden Pfade für Quelle und Ziel erlauben es uns, den Pfad zur Datei auf beiden Seiten des Kopiervorgangs anzugeben, sowie das/die zu verwendende(n) Benutzerkonto(s).
Im obigen Beispiel wird die lokale Datei an einen entfernten Ort kopiert – . Wie wir später sehen werden, können wir das Remote-Format verwenden, um Quelle oder Ziel zu beschreiben, so dass diese Befehle sowohl Dateien auf einen Server hochladen als auch Dateien von einem Server herunterladen können.
2.3. Wichtige Dinge zu beachten
Es gibt ein paar Punkte zu beachten, wenn wir Dateien über ssh mit einem beliebigen Tool übertragen:
- Der Befehl scp/rsync fragt nach dem Benutzerkennwort, um sich am entfernten Server anzumelden, wenn wir keine automatische Anmeldung durch den Austausch von RSA-Schlüsseln eingerichtet haben
- Wir müssen unseren Benutzernamen oder die Server-IP für unseren lokalen Server nicht angeben
- Wir können entweder einen absoluten Pfad oder einen relativen Pfad zur Quell-/Zieldatei angeben, wobei relative Pfade sich auf das aktuelle Arbeitsverzeichnis oder das Home-Verzeichnis des entfernten Benutzers beziehen
2.4. Angeben eines Dateinamens
Es ist nicht zwingend erforderlich, einen Dateinamen im Zielpfad anzugeben. Wenn wir keinen Dateinamen angeben, wird der Name der Quelldatei verwendet.
In unserem ersten Beispiel wird die Datei im Zielverzeichnis mit dem Namen text.log erstellt. Hätten wir gewollt, dass die Datei unter einem anderen Namen gespeichert wird, hätten wir einen Dateinamen als Teil des Zielpfads angeben können.
Mit Hilfe des impliziten Dateinamens können wir eine Datei von einem entfernten Linux-Server in das aktuelle Verzeichnis mit ihrem ursprünglichen Namen kopieren:
scp :/var/log/text.log .rsync :/var/log/text.log .
Hier steht der Parameter „.“ für das aktuelle Arbeitsverzeichnis. Wir können auch einen anderen Pfad angeben, wenn wir wollen:
scp :/var/log/text.log /opt/path/mytextlog.logrsync :/var/log/text.log /opt/path/mytextlog.log
2.5. Kopieren zwischen Servern
Wir können diese Werkzeuge sogar zum Kopieren zwischen zwei entfernten Servern verwenden. Kopieren wir zum Beispiel die Datei text.log von Server 111.111.111.111. auf Server 222.222.222.222 für den Root-Benutzer:
scp :/var/log/text.log :/var/logrsync :/var/log/text.log :/var/log
Nachdem wir nun ein grundlegendes Verständnis von scp und rsync haben, wollen wir sie uns genauer ansehen.
scp (Secure Copy)
scp steht für Secure Copy und wird verwendet, um Dateien über eine ssh-Verbindung zu übertragen. Es handelt sich dabei um eine Rohkopie, das heißt, es werden nur die Daten aus dem Quellordner gelesen und in den Zielordner geschrieben. Wenn wir also eine schnelle Kopie suchen, die nicht länger als ein paar Minuten dauern sollte, dann sollten wir uns für scp entscheiden.
Wenn wir eine große Datei übertragen, sollten wir sicherstellen, dass wir eine stabile Internetverbindung haben. Da scp nicht wiederaufnehmbar ist, kann bei einem Verbindungsabbruch während einer großen Übertragung Zeit verloren gehen, und der gesamte Kopiervorgang muss neu gestartet werden.
3.1. Installation
Bei den meisten Linux-Distributionen ist scp bereits vorinstalliert. Wir können leicht überprüfen, ob scp installiert ist oder nicht:
which scp
Wir sehen den Pfad zum scp-Befehl, wenn er bereits installiert ist. Eine leere Antwort bedeutet, dass scp nicht installiert ist.
Wenn wir es noch nicht haben, müssen wir zur Installation von scp das OpenSSH-Client-Paket aus dem offiziellen Paket-Repository installieren:
sudo apt-get install openssh-clients # For Debian based systems like Ubuntu sudo yum install openssh-clients # For Red Hat based systems like CentOS and Fedora
Lassen Sie uns ein paar gängige Szenarien für die Verwendung von scp durchgehen.
3.2. Mehrere Dateien übertragen
Wir können eine durch Leerzeichen getrennte Liste von Dateien angeben, um mehrere Dateien zu übertragen:
scp text.log text1.log text2.log :/var/log
Wir können auch die Option -r verwenden, um das gesamte Verzeichnis rekursiv zu kopieren. Zum Beispiel, um alle Dateien aus dem Verzeichnis /home/app/log/ zu kopieren:
scp -r /home/app/log :/var/log
Wir können * verwenden, um Dateien zu senden, die einem bestimmten Namensmuster entsprechen. Zum Beispiel haben wir vier Dateien text.log, text2.log, app.log und app2.log, und wir wollen nur Dateien senden, die mit app beginnen:
scp /home/app/log/app* :/var/log
3.3. Dateien mit Identitätsdateien übertragen
Die schlüsselbasierte Authentifizierung wird in den meisten Linux-Distributionen bevorzugt. Im scp-Befehl kann die Identitätsdatei mit der Option -i angegeben werden:
scp -i key.pem text.log :/var/log
Viele Systemadministratoren verwenden die schlüsselbasierte Authentifizierung für die Übertragung von Dateien, da sie nicht bei jeder Übertragung die Anmeldedaten des Benutzers benötigt.
3.4. On-the-Fly-Komprimierung
Wir können die Übertragungszeit reduzieren, indem wir eine On-the-Fly-Komprimierung mit der Option -C verwenden. Dies komprimiert und dekomprimiert die Datei am Quell- bzw. Zielpfad:
scp -C text.log :/var/log
3.5. Bandbreite während der Übertragung begrenzen
Mit der Option -l können wir die Bandbreite in Kbit/s angeben:
scp -l 500 text.log :/var/log
3.6. Verbose-Modus für die Fehlersuche
Wir können den Verbose-Modus mit der Option -v aktivieren:
scp -v text.log :/var/log
Die Ausgabe würde etwa so aussehen:
Executing: program /usr/bin/ssh host prod-reporting-b, user jain, command scp -v -t /tmp OpenSSH_7.9p1, LibreSSL 2.7.3 debug1: Reading configuration data /etc/ssh/ssh_config debug1: /etc/ssh/ssh_config line 48: Applying options for * debug1: Connecting to prod-reporting-b port 22. debug1: Connection established. ------ Transferred: sent 2856, received 2932 bytes, in 2.1 seconds Bytes per second: sent 1366.8, received 1403.1 debug1: Exit status 0
Verbose (Debug-)Ausgabe gibt die genauen Schritte aus, die scp ausführt, was nützlich ist, um Verbindungen, Authentifizierung und Konfigurationsprobleme zu debuggen.
rsync (Remote-Synchronisierung)
rsync ist schnell und vielseitig. Es eignet sich gut zum Synchronisieren und intelligenten Übertragen von Dateien, weil es den Überblick darüber behält, wie viele Daten bereits kopiert wurden und wie viele noch übrig sind.
Wir sollten rsync verwenden, wenn wir große Dateien übertragen müssen – selbst wenn es Probleme mit der Netzwerkverbindung gibt, gehen die bis dahin kopierten Daten nicht verloren, und wenn die Verbindung wiederhergestellt ist, wird die Kopie ab diesem Punkt fortgesetzt.
rsync ist schneller als der scp-Befehl, wenn wir dieselbe Datei mehrfach übertragen müssen, da es ein Remote-Update-Protokoll verwendet, das es erlaubt, nur die Unterschiede zwischen zwei Dateisätzen zu übertragen.
4.1. Installation
Lassen Sie uns überprüfen, ob rsync installiert ist, indem wir es aufrufen, um seine Version anzuzeigen:
rsync --version
Wenn wir einen Fehler erhalten, können wir es installieren:
sudo apt-get install rsync # For Debian based systems like Ubuntu sudo yum install rsync # For Red Hat based systems like CentOS and Fedora
Lassen Sie uns einige häufige Szenarien durchgehen, in denen wir rsync verwenden können.
4.2. Einen Trockenlauf machen
Da rsync so mächtig ist, kann es gefährlich sein, es zu benutzen, ohne zu überprüfen, was es tun wird. Glücklicherweise bietet rsync die Option -dry-run, die einen Testlauf durchführt, ohne tatsächlich Dateien zu übertragen:
rsync --dry-run text.log :/var/log
4.3. Kopieren von Attributen und Metadaten
rsync bietet die Option -a, die symbolische Links, Änderungszeiten, Gruppe, Eigentümer und Berechtigungen zusammen mit dem Dateiinhalt kopiert.
Eine weitere wichtige Option ist -h, die die Ausgabe in einer für Menschen lesbaren Form ausgibt. Dies kann besonders hilfreich sein, wenn es zusammen mit der Option -dry-run ausgeführt wird:
rsync -ah --dry-run text.log :/var/log
4.4. Mehrere Dateien in einem Verzeichnis übertragen
Wir können eine Liste von Dateien durch ein Leerzeichen getrennt angeben, um mehrere Dateien zu übertragen:
rsync text.log text1.log text2.log :/var/log
Die Option -r kopiert rekursiv alle Dateien im Verzeichnis:
rsync -r /home/app/log :/var/log
Der Operator * sendet Dateien, die einem bestimmten Muster entsprechen:
rsync /home/app/log/app* :/var/log
Mit der Option -include und der Option -exclude können wir Dateien in die Liste der Dateien innerhalb des Verzeichnisses ein- und ausschließen. Zum Beispiel, um alle Dateien aus einem Verzeichnis zu senden, mit Ausnahme derjenigen, die mit ‚R‘ beginnen:
rsync --include '*' --exclude 'R*' text.log :/urs/log
4.5. On-The-Fly-Komprimierung
Wir können die Übertragungszeit reduzieren, indem wir eine On-The-Fly-Komprimierung mit der Option -z verwenden. Dies komprimiert und dekomprimiert die Datei im Quell- bzw. Zielpfad:
rsync -z text.log :/var/log
4.6. Vorhandene Dateien im Zielpfad vor der Übertragung löschen
Die Option -delete löscht vorhandene Dateien im Zielpfad, bevor neue Dateien übertragen werden:
rsync --delete text.log :/var/log
4.7. Quelldateien nach der Übertragung automatisch entfernen
Angenommen, wir wollen ein Backup der Protokolle vom Produktionsserver auf einen Backup-Server machen. In diesem Szenario würden wir wahrscheinlich gerne Dateien vom Produktionsserver entfernen, nachdem wir alle Dateien auf unseren Backup-Server übertragen haben.
rsync server bietet die Option -remove-source-files, um Quelldateien zu entfernen, nachdem die Übertragung abgeschlossen ist:
rsync --remove-source-files text.log :/var/log
Welches Tool wählen?
Wir können beide Tools verwenden, um Dateien zwischen Linux-Rechnern zu übertragen. Allerdings sollten wir scp in Betracht ziehen, wenn die Dateigröße klein ist – es ist ein einfaches Kopierwerkzeug und weit verbreitet. In unserem täglichen Gebrauch ist scp die einfache Wahl für kleine, einmalige Übertragungen.
Wir würden am meisten von rsync profitieren, wenn die Dateigröße groß ist oder wenn wir eine komplexere und effizientere Synchronisation benötigen. Es ist auch die bessere Wahl für wiederkehrende Aufgaben wie Cron-Jobs und Skripte.
Fazit
In diesem Artikel haben wir uns zwei Dateiübertragungs-Tools angesehen: scp und rsync.
Wir haben uns auch die Unterschiede zwischen ihnen angesehen und welche Tools zu bestimmten Anwendungsfällen passen.