Im Vergleich
| scp | sftp | rsync | |
|---|---|---|---|
| Am besten für | Eine schnelle Kopie | Durchsuchen, eingeschränkte Konten | Ordner synchronisieren, große Dateien |
| Voraussetzung auf dem Server | SSH mit SFTP-Subsystem, oder scp mit -O | SSH mit SFTP-Subsystem | SSH und installiertes rsync |
| Sendet nur Änderungen | Nein | Nein | Ja |
| Fortsetzen | Nein | Ja, reget und reput | Ja, --partial |
| Port-Option | -P 2222 | -P 2222 | -e 'ssh -p 2222' |
scp
scp file.txt user@server:/tmp/
scp -r folder user@server:/tmp/
scp -P 2222 user@server:/var/log/app.log .
Seit OpenSSH 9.0 nutzt scp das SFTP-Protokoll und nicht mehr das alte scp-Protokoll. Sie sehen das mit scp -v, das Sending subsystem: sftp ausgibt. Der praktische Gewinn: Dateinamen mit Leerzeichen oder Sonderzeichen brauchen kein doppeltes Quoting mehr.
Hat der Server kein SFTP-Subsystem, scheitert die Kopie mit subsystem request failed on channel 0. Fügen Sie -O hinzu, um das alte Protokoll zu nutzen:
scp -O file.txt user@server:/tmp/
Weitere Fälle wie Ordner, andere Ports und zwei Server stehen in den scp-Beispielen.
sftp
sftp user@server öffnet eine kleine Shell mit ls, cd, get, put und bye. Es funktioniert bei Konten ohne Shell und ist deshalb die übliche Wahl für eingeschränkte Benutzer. Siehe die Einrichtung eines Benutzers nur für sftp.
Alle Befehle der Eingabeaufforderung stehen in der Liste der sftp-Befehle.
Es kann fortsetzen. Innerhalb von sftp setzen diese Befehle eine Teildatei fort:
reput big.bin /tmp/big.bin
reget /tmp/big.bin big.bin
In unserem Test liefen beide ab einer Teildatei zu Ende, und die Prüfsummen stimmten mit dem Original überein. Für Skripte schreiben Sie die Befehle in eine Datei und führen sftp -b commands.txt user@server aus.
rsync
rsync -av src/ user@server:/srv/app/
rsync -avz -e 'ssh -p 2222' src/ user@server:/srv/app/
rsync -aP big.bin user@server:/tmp/
-a behält Rechte, Zeiten und Links bei und kopiert Ordner. -v listet Dateien auf. -z komprimiert, was bei Text auf langsamen Leitungen hilft. -P bedeutet --partial --progress.
rsync muss auf beiden Seiten vorhanden sein. Fehlt es auf dem Server, erhalten Sie:
bash: line 1: rsync: command not found
Der abschließende Slash
Ein Slash am Ende der Quelle verändert das Ergebnis. Wir haben beide Formen an einem Ordner src mit a.txt ausgeführt:
rsync -a src user@server:/tmp/noslash/ # creates /tmp/noslash/src/a.txt
rsync -a src/ user@server:/tmp/slash/ # creates /tmp/slash/a.txt
Mit dem Slash kopiert rsync den Inhalt des Ordners, ohne ihn den Ordner selbst. Ein Slash am Ziel macht keinen Unterschied.
Nur Geändertes senden
In unserem Test wurde eine 50-MiB-Datei einmal gesendet, dann wurden 4 KiB in ihrer Mitte geändert:
- Erste Übertragung: 52.441.699 Byte gesendet.
- Zweite Übertragung: 43.547 Byte gesendet.
Diese Ersparnis gibt es über ein Netzwerk. Zwischen zwei Ordnern auf demselben Rechner kopierte rsync in unserem Test die ganze Datei erneut.
Fortsetzen
Wir haben eine Übertragung dieser Datei mit --partial gestoppt, wodurch 15,4 MB am Ziel blieben. Derselbe Befehl, erneut ausgeführt, nutzte diese Bytes und sendete den Rest, und cmp fand das Ergebnis identisch mit dem Original. Ohne --partial entfernt rsync die Teildatei, wenn es unterbrochen wird.
Zwei Fallen
- rsync kann eine geänderte Datei überspringen. Standardmäßig vergleicht es nur Größe und Änderungszeit. In unserem ersten Test fiel die Änderung von 4 KiB in dieselbe Sekunde wie die frühere Kopie, bei gleicher Größe, und rsync sendete nichts.
-cvergleicht Prüfsummen, auf Kosten des Lesens jeder Datei. --deleteentfernt Dateien im Ziel, die in der Quelle nicht vorhanden sind. Bei einem falschen Pfad können das sehr viele sein. Fügen Sie vorher-nhinzu, um die Liste zu sehen:rsync -avn --delete src/ user@server:/srv/app/.
Unter neuerem macOS kann /usr/bin/rsync openrsync statt des Originals sein: Auf unserem Test-Mac gab rsync --version openrsync: protocol version 29 aus. Die obigen Optionen funktionierten, aber es kann nicht alles. Prüfen Sie also die Ausgabe von rsync --version, wenn eine Option abgelehnt wird.
Was Sie wählen
- Eine Datei, einmal:
scp. - Sie müssen sich erst umsehen, oder das Konto erlaubt nur SFTP:
sftp. - Immer wieder derselbe Ordner, oder eine große Datei auf einer schlechten Verbindung:
rsync. - Ihr lokaler Editor und Ihre Werkzeuge für Serverdateien: Binden Sie den Ordner mit sshfs ein.
Alle drei lesen Ihre SSH-Konfiguration, ein Host-Eintrag spart also Port und Benutzer. Siehe die SSH-Konfigurationsdatei.
Fragen
Sind SFTP und scp dasselbe?
Nein. sftp ist ein interaktiver Client zum Durchsuchen und Übertragen von Dateien, scp ein Kopierbefehl in einer Zeile. Seit OpenSSH 9.0 nutzt scp darunter das SFTP-Protokoll.
Ist rsync schneller als scp?
Wenn am Ziel schon eine ältere Kopie liegt, ja: rsync sendet nur die geänderten Teile. In unserem Test schickte eine Änderung von 4 KiB in einer 50-MiB-Datei rund 43 KB. Bei einer neuen Datei senden beide die ganze Datei.
Funktioniert rsync über SSH?
Ja. Bei einem entfernten Pfad verbindet sich rsync standardmäßig mit ssh, aber rsync muss auch auf dem Server installiert sein.
Quellen
- OpenSSH 9.0 release notes
- scp(1), OpenBSD manual
- sftp(1), OpenBSD manual
- rsync(1) manual
- How rsync works