Ist es möglich, Rsync über SFTP zu verwenden (ohne eine SSH-Shell)?

60

Rsync über ssh funktioniert jedes Mal hervorragend.

Wenn Sie jedoch versuchen, eine Synchronisierung mit einem Host durchzuführen, der nur SFTP-Anmeldungen, nicht jedoch SSH-Anmeldungen zulässt, tritt der folgende Fehler auf:

rsync -av / source ssh user @ remotehost: / target /

Nicht übereinstimmende Protokollversion - Ist Ihre Shell sauber? (Eine Erklärung finden Sie in der rsync-Manpage.) rsync-Fehler: Protokollinkompatibilität (Code 2) bei compat.c (171) [sender = 3.0.6]

Hier ist der relevante Abschnitt aus der rsync-Manpage:

Diese Meldung wird normalerweise von Ihren Startskripten oder der Remote-Shell-Funktion verursacht, die unerwünschten Datenmüll auf dem Stream erzeugt, den rsync für den Transport verwendet. Um dieses Problem zu diagnostizieren, führen Sie Ihre Remote-Shell folgendermaßen aus:

          ssh remotehost /bin/true > out.dat

dann schau mal auf out.dat. Wenn alles richtig funktioniert, sollte out.dat eine Null-Länge-Datei sein. Wenn Sie den obigen Fehler von rsync erhalten, werden Sie wahrscheinlich feststellen, dass out.dat Text oder Daten enthält. Schauen Sie sich den Inhalt an und versuchen Sie herauszufinden, was ihn produziert. Die häufigste Ursache sind falsch konfigurierte Shell-Startskripts (z. B. .cshrc oder .profile), die Ausgabeanweisungen für nicht interaktive Anmeldungen enthalten.

Dies auf meinem System zu versuchen, ergab in out.dat Folgendes:

ssh-dummy-shell: Kommando nicht erlaubt.

Wie ich dachte, erlaubt der Host keine SSH-Anmeldungen.

Der folgende Link zeigt, dass es möglich ist, diese Aufgabe mithilfe von Fuse mit sshfs auszuführen. Sie ist jedoch extrem langsam und nicht für den produktiven Einsatz geeignet.

Gibt es eine Chance, rsync sftp zum Laufen zu bringen?

Tom Feiner
quelle
3
LFTP wird den Trick tun. Ich synchronisiere lokal zu remote mit dem -R-Schalter
Wissen Sie, wie die Befehle auf dem Server eingeschränkt sind? Wenn Sie ForceCommand in sshd_config festlegen, können Sie prüfen, ob Sie die Datei ändern können, auf die verwiesen wird. Oder wenn es per Befehl in authorized_keys gesetzt ist, können Sie vielleicht über sshfs auf authorized_keys zugreifen und es ändern?
Ptman
Sie könnten versuchen, csync : csync /home/csync sftp://[email protected]:2222/home/csyncSiehe diese Antwort .
Nachtigall
6
Irgendwann habe ich es mit lftp gemacht :lftp -e "mirror -eRv /local/dir/ /remote/dir; quit;" sftp://user@server:port
nachtigall
@nachtigall Weißt du, wie man LFTP mit mehreren Eingabedateien / einer Liste von Dateien und Verzeichnissen verwendet?
Bortran

Antworten:

39

Leider nicht direkt. rsyncerfordert eine saubere Verknüpfung mit einer Shell, mit der die Remote-Kopie von gestartet werden kann rsync, wenn diese auf diese Weise ausgeführt wird.

Wenn Sie eine Möglichkeit haben, langlebige Abhörprozesse auf dem Host auszuführen, können Sie versuchen, rsync manuell zu starten, um auf Verbindungen an einem nicht privilegierten Port zu warten. Für die meisten Techniken ist jedoch auch ein ordnungsgemäßer Shell-Zugriff über SSH erforderlich Die Firewall-Vorkehrungen des Hosts lassen Verbindungen auf dem von Ihnen gewählten Port (und auf dem Host, auf dem rsync installiert ist) zu. Das Ausführen von rsync als öffentlich adressierbarer Dienst (anstatt indirekt über SSH oder ähnliches) wird für nicht öffentliche Daten im Allgemeinen jedoch nicht empfohlen.

Wenn Ihr Host execSkripte in PHP oder ähnlichem zulässt und diese nicht gesperrt sind, sodass zusätzliche Prozesse nicht von Benutzerskripten bearbeitet werden können , können Sie versuchen, rsync auf diese Weise im Listening-Modus zu starten. Wenn Ihr Endgerät verbindbar ist (Sie verwenden SSH, auf das die Außenwelt zugreifen kann), können Sie dies in umgekehrter Reihenfolge versuchen: Lassen Sie ein Skript auf dem Server rsync ausführen, aber anstatt auf eingehende Verbindungen zu warten, wenden Sie sich an Ihren lokalen Dienst, und führen Sie die Synchronisierung auf diese Weise durch. Dies setzt immer noch voraus, dass rsync tatsächlich auf dem Host installiert ist, der nicht vorgegeben ist, oder dass Sie eine Arbeitskopie hochladen können, dies hat jedoch nicht die Sicherheitsauswirkungen, dass ein rsync-Dämon öffentlich adressierbar ausgeführt und über eine unverschlüsselte Verbindung mit ihm gesprochen wird Kanal.

Das oben beschriebene Herumspielen kann jedoch gegen die Richtlinien des Hosts verstoßen, auch wenn es überhaupt funktioniert, und einen Anstoß verursachen. Am besten fragen Sie, ob für dieses Konto eine vollständige Shell aktiviert werden kann, und geben entweder rsync für diesen Host auf oder geben diesen Host auf und ziehen an einen anderen Ort, wenn dies nicht der Fall ist.

David Spillett
quelle
2
Beachten Sie, dass es keine vollständige Shell sein muss. Der Befehl rsync muss nur mit den richtigen Argumenten ausgeführt werden können. scponly ist dafür nützlich.
Sciurus
19

Theoretisch ja. Sie können das entfernte Dateisystem mit FUSE auf Ihrem lokalen Computer mounten . Anschließend können Sie eine lokale Kopie von rsync zwischen dem bereitgestellten Verzeichnis und dem lokalen Verzeichnis ausführen. Ich habe das nicht persönlich ausprobiert, aber es sollte theoretisch funktionieren. Es wäre wahrscheinlich weitaus weniger effizient, den rsync über SSH durchzuführen, da mindestens ein Teil jeder Datei übertragen werden müsste, um den Vergleich durchzuführen.

Kamil Kisiel
quelle
11
Dies sollte funktionieren, wenn der Vergleich von Zeitstempel und Größe ausreicht, um zu entscheiden, was gesendet werden soll. Sobald eine Prüfsumme benötigt wird, wird die gesamte entfernte Datei sowie die gesendeten Aktualisierungen über die Leitung gelesen. Stellen Sie daher sicher, dass die Optionen von rsync so eingestellt sind, dass für jede Datei alles oder nichts ausgeführt wird (ohne --ignore- zu verwenden). times oder --checksum und die Angabe von --whole-file können ausreichen. Einige Optionen wie --link-dest funktionieren auf diese Weise höchstwahrscheinlich nicht richtig (oder überhaupt nicht).
David Spillett
Vielen Dank, dass Sie einige Details hinzugefügt haben, David. Das ist die Art von Effizienzbeschränkungen, an die ich gedacht habe, die ich nur nicht so gut formuliert habe :)
Kamil Kisiel
Es ist ein Workaround mit Einschränkungen, ja, aber es ist gut genug, wenn es keine Möglichkeit gibt, "richtiges" rsync aufzurufen
Valery Lourie
10

Eine Alternative zur Verwendung von rsync besteht darin, stattdessen lftp (das eine Verbindung zu sftp herstellen kann) zu verwenden und den Befehl mirror zu verwenden. Zum Beispiel kann man tun

lftp
~> open -u user,password sftp://host.com
~> mirror remotedir outdir
~> quit
Xioxox
quelle
1
Obwohl dieser Beitrag die Frage nicht beantwortet, bietet er eine hilfreiche Alternative
Dmitri
5

ein bisschen spät, aber hier ist, wie ich es mit sshfs mache

  source /scratch/slimdata/password.sh
  mkdir tmp_mnt
  echo $PASSWORD | sshfs user@host:dir tmp_mnt -o password_stdin
  rsync -rutL --delete tmp_mnt/ to_sync/
  fusermount -u tmp_mnt
  rmdir tmp_mnt
Jonathan
quelle
3
Wie @David Spillett in seinem Kommentar zu einer früheren Antwort ( serverfault.com/questions/135618/… ) ausführt , funktioniert dies, ist jedoch eine ineffiziente Verwendung des rsync-Protokolls.
Evan Anderson
2
Jonathan, ich denke deine Lösung ist falsch. Wenn Sie ein Remote-Laufwerk einbinden und rsync so ausführen, als würden Sie zwei lokale Ordner synchronisieren, wird beim Synchronisieren immer alles übertragen, da der rsync-Prozess auf Ihrem lokalen Computer die Hash-Werte der Remote-Dateien berechnet. Dies bedeutet, dass die gesamte Datei übertragen wird und die Vorteile von rsync verloren gehen. Edit: ah diese Antwort wurde mehrmals gegeben ... sry für die Replikation: D
Thekwasti
2

Nein. Rsync führt rsync auf der anderen Seite aus und kommuniziert damit. Dies bedeutet, dass eine Art Shell-Zugriff erforderlich ist.

Ignacio Vazquez-Abrams
quelle
2

Eine Alternative wäre, rsync als Daemon zu starten und eine Verbindung über einen SSH-Tunnel herzustellen.

Dan Andreatta
quelle
Diese Antwort ist zu kurz, um vollständig hilfreich zu sein. Wenn die Serverseite jedoch keinen Shell-Zugriff zulassen kann, jedoch (1) einen lokal empfangenden Rsync-Server (von außen aus Sicherheitsgründen nicht verfügbar) und (2) einen SSH-Tunnel zulassen kann, dann in Prinzipiell könnte man sich über eine Regel in den Server einloggen authorized_keys, die einen bestimmten Tunnel zulässt und zB läuft sleep 86400. Dann könnte die Clientseite dann rsyncüber den Tunnel.
Stéphane Gourichon
2

Option, die das Beste von allem kombiniert

Es scheint die folgenden Vorteile zu haben, die andere Antworten hier nicht haben:

  • profitiert voll von SSH (sicher)
  • Rsync voll ausnutzen (bandbreiteneffizientes Protokoll, alle Rsync-Optionen wie Bandbreitenbegrenzung)
  • eigentlich effizient (im gegensatz zu sshfs, die manchmal die tage retten, aber in der praxis immer noch langsam sind)
  • benötigt keine willkürlichen Shell-Befehle serverseitig
  • Benötigt keinen Server, um SSH-Tunnel zuzulassen
  • Benötigt keinen Server, um einen rsyncDaemon auszuführen

Ich habe es noch nicht getestet, aber ich habe alle diese Funktionen mit Ausnahme von erfolgreich verwendet rrsync.

Wie es geht

  • lokal einen Schlüssel erstellen mit ssh-keygen(openSSH-Funktion)
  • ~/.ssh/authorized_keysErlaube die Anmeldung nur mit diesem bestimmten Schlüssel, mit einem Eintrag im Server (openSSH-Funktion)
  • Verknüpfen Sie diesen Schlüssel mit einem bestimmten Befehl ~/.ssh/authorized_keys(openSSH-Funktion), indem Sie als Befehl das rrsyncmit rsync verteilte Skript verwenden , etwacommand="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-

Dann können Sie normal vom Client aus rsyncen.

Wenn Sie weitere Informationen benötigen

Einschränken des SSH-Zugriffs auf rsync | Guy Rutenberg

Einen Schritt weiter oben

Der Befehl am Ende dieser Seite kann verkürzt werden. In ~/.ssh/configschaffen eine Strophe wie folgt aus :

Host remote # can be host or ip or custom-label User user # login on remote host HostName optional-dns-resolvable-host-or-ip # if label used above IdentityFile ~/.ssh/id_remote_backup

dann dein rsync befehl vom client

rsync -e "ssh -i $HOME/.ssh/id_remote_backup" -av user@remote: etc2/

wird

rsync -av user@remote: etc2/
Stéphane Gourichon
quelle
1
Leider hat dies nichts mit der Verwendung von rsync mit einem SFTP-Server zu tun. Hier geht es darum, einen OpenSSH-Server so zu konfigurieren, dass rsyncer ausgeführt werden kann, wobei der SFTP-Aspekt umgangen wird. Wenn Ihnen der SFTP-Server einer anderen Person angezeigt wird, über den Sie keine Kontrolle haben, kann diese Antwort das Problem nicht lösen.
Malvineous
Du hast recht. Vielleicht habe ich dies tatsächlich geschrieben, um eine andere Frage zu beantworten, und versehentlich hier gepostet. Ich denke darüber nach, meine Antwort hier zu entfernen.
Stéphane Gourichon