Est-il possible d'utiliser rsync sur sftp (sans shell ssh)?

60

Rsync over ssh fonctionne bien à chaque fois.

Cependant, essayer de rsync sur un hôte qui n'autorise que les connexions sftp, mais pas les connexions ssh, génère l'erreur suivante:

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

Non correspondance de version de protocole - votre shell est-il propre? (voir la page de manuel rsync pour une explication) Erreur rsync: incompatibilité de protocole (code 2) dans compat.c (171) [expéditeur = 3.0.6]

Voici la section pertinente de la page de manuel rsync:

Ce message est généralement dû au fait que vos scripts de démarrage ou vos installations de shell à distance génèrent des déchets indésirables sur le flux utilisé par rsync pour son transport. La façon de diagnostiquer ce problème consiste à exécuter votre shell distant comme suit:

          ssh remotehost /bin/true > out.dat

puis regardez out.dat. Si tout fonctionne correctement, out.dat devrait être un fichier de longueur zéro. Si vous obtenez l'erreur ci-dessus de la part de rsync, vous constaterez probablement que out.dat contient du texte ou des données. Regardez le contenu et essayez de déterminer ce qui le produit. La cause la plus courante est constituée par des scripts de démarrage de shell mal configurés (tels que .cshrc ou .profile) contenant des instructions de sortie pour les connexions non interactives.

Essayer ceci sur mon système a produit ce qui suit dans out.dat:

ssh-dummy-shell: Commande non autorisée.

Comme je le pensais, l'hôte n'autorise pas les connexions SSH.

Le lien suivant montre qu'il est possible d'accomplir cette tâche en utilisant un fusible avec sshfs - toutefois, il est extrêmement lent et ne convient pas à une utilisation en production.

Existe-t-il une chance de faire fonctionner sftp rsync?

Tom Feiner
la source
3
lftp fera l'affaire. Je synchroniserai local à distance avec le commutateur -R
Savez-vous comment les commandes sont restreintes sur le serveur? Si c'est en définissant ForceCommand dans sshd_config, voyez si vous pouvez modifier le fichier qui pointe vers. Ou si elle est définie par une commande dans allowed_keys, alors vous pourrez peut-être accéder à allowed_keys via sshfs et le changer?
Pman
Vous pouvez essayer csync : csync /home/csync sftp://[email protected]:2222/home/csyncvoir cette réponse .
nachtigall
6
Finalement, je l'ai fait avec lftp :lftp -e "mirror -eRv /local/dir/ /remote/dir; quit;" sftp://user@server:port
nachtigall
@nachtigall savez-vous comment utiliser lftp avec plusieurs fichiers d'entrée / une liste de fichiers et répertoires?
bortran

Réponses:

39

Malheureusement pas directement. rsyncnécessite un lien propre avec un shell qui lui permettra de démarrer la copie distante de rsync, lorsqu'il est exécuté de cette manière.

Si vous êtes en mesure d'exécuter des processus d'écoute de longue durée sur l'hôte, vous pouvez essayer de démarrer rsync en écoutant manuellement les connexions sur un port non privilégié, mais la plupart des techniques permettant de le faire nécessiteraient également un accès approprié au shell via SSH. les arrangements de pare-feu des hôtes laissant les connexions entrer sur le port que vous avez choisi (et l'hôte ayant rsync installé en premier lieu). L'exécution de rsync en tant que service adressable publiquement (plutôt qu'indirectement via SSH ou similaire) n'est généralement pas recommandée pour les données non publiques.

Si votre hôte autorise les scripts en PHP ou similaire et ne le verrouille pas afin que des processus supplémentaires ne puissent pas être execédités par des scripts utilisateur, vous pouvez essayer de démarrer rsync en mode écoute de cette façon. Si votre extrémité est connectable (vous utilisez SSH accessible au monde extérieur), vous pouvez essayer en sens inverse: faire exécuter un script sur rsync sur le serveur, mais au lieu d'écouter les connexions entrantes, demandez-lui de contacter votre service local et de le synchroniser. Cela dépend toujours de l’installation de rsync sur l’hôte, ce qui n’est pas une donnée, ou que vous pouvez télécharger une copie de travail, mais n’a pas les implications de sécurité liées à l’exécution d’un démon rsync de façon publiquement adressable et à la discussion via une connexion non cryptée. canal.

Comme décrit ci-dessus, déconner peut s’avérer contraire aux politiques de l’hôte, même si cela fonctionne et risque de vous faire mal. Vous feriez mieux de demander si un shell complet peut être activé pour ce compte et d'abandonner rsync pour cet hôte ou de l'abandonner et de se déplacer ailleurs s'il ne le fait pas.

David Spillett
la source
2
Notez qu'il n'est pas nécessaire que ce soit une coque complète; il doit simplement permettre à la commande rsync avec les arguments appropriés de s'exécuter. scponly est utile pour cela.
Sciurus
19

Théoriquement oui. Vous pouvez monter le système de fichiers distant sur votre ordinateur local à l' aide de FUSE . Ensuite, vous pouvez exécuter une copie locale de rsync entre le répertoire monté et le répertoire local. Personnellement, je n'ai pas essayé cela, mais cela devrait fonctionner en théorie. Il serait probablement beaucoup moins efficace de réaliser rsync sur SSH car il faudrait transférer au moins une partie de chaque fichier pour effectuer la comparaison.

Kamil Kisiel
la source
11
Cela devrait fonctionner quand la comparaison timestamp + size est suffisante pour décider de ce qui doit être envoyé. Dès qu'une somme de contrôle est nécessaire, l'intégralité du fichier distant est lue sur la ligne, ainsi que les mises à jour envoyées. Assurez-vous donc que les options de rsync sont définies de telle sorte qu'il effectue tout ou rien pour chaque fichier (sans utiliser --ignore- fois ou --checksum et avoir --whole-file spécifié peut être suffisant). Certaines options telles que --link-dest ont peu de chance de fonctionner correctement (ou pas du tout) de cette façon.
David Spillett
Merci d'avoir ajouté quelques détails, David. Voilà le genre de limitations d'efficacité auxquelles je pensais, mais je ne les ai pas articulées aussi bien :)
Kamil Kisiel
C'est une solution de contournement avec des limitations, oui, mais c'est suffisant s'il n'y a aucun moyen d'invoquer le "bon" rsync
Valery Lourie
10

Une alternative à l'utilisation de rsync consiste à utiliser à la place lftp (qui peut se connecter à sftp) et à utiliser la commande mirror. Par exemple on peut faire

lftp
~> open -u user,password sftp://host.com
~> mirror remotedir outdir
~> quit
xioxox
la source
1
Bien que ce message ne réponde pas à la question, il constitue une alternative utile
Dmitri Chubarov
6

un peu tard, mais voici comment je le fais, en utilisant sshfs

  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
la source
3
Comme @David Spillett l'a dit dans son commentaire sur une réponse précédente ( serverfault.com/questions/135618/… ), cela fonctionnera, mais constitue une utilisation inefficace du protocole rsync.
Evan Anderson
2
Jonathan, je pense que votre solution est fausse. Si vous montez un lecteur distant et exécutez rsync comme si vous synchronisiez deux dossiers locaux, tout est transféré lors de la synchronisation, car le processus rsync sur votre ordinateur local calcule les valeurs de hachage des fichiers distants. Cela signifie que tout le fichier est transféré et que les avantages de rsync sont perdus. Edit: ah cette réponse a été donnée à plusieurs reprises ... sry pour réplication: D
Thekwasti
2

Non. Rsync fonctionne en exécutant rsync de l'autre côté et en communiquant avec ce dernier, ce qui signifie qu'une forme d'accès au shell est requise.

Ignacio Vazquez-Abrams
la source
2

Une alternative serait de démarrer rsync en tant que démon et de s'y connecter via un tunnel SSH.

Dan Andreatta
la source
Cette réponse est trop courte pour être totalement utile, mais si le côté serveur ne peut pas autoriser l’accès au shell mais peut permettre (1) à un serveur rsync d’écouter localement (non disponible de l’extérieur, pour des raisons de sécurité), et (2) un tunnel ssh, principe, on peut se connecter au serveur via une règle authorized_keysqui autorise un tunnel spécifique et s'exécute par exemple sleep 86400. Ensuite, le côté client pourrait alors rsyncvia le tunnel.
Stéphane Gourichon
2

Option combinant le meilleur de tous

Il semble y avoir les avantages suivants par rapport à d’autres réponses:

  • bénéficie pleinement de SSH (sécurisé)
  • tire pleinement parti de rsync (protocole économe en bande passante, toutes les options de rsync telles que la limitation de la bande passante)
  • réellement efficace (contrairement à sshfs qui sauve parfois des jours mais reste lent dans la pratique)
  • n'a pas besoin de commandes shell arbitraires côté serveur
  • n'a pas besoin de serveur pour autoriser les tunnels SSH
  • n'a pas besoin de serveur pour lancer un rsyncdémon

Je ne l'ai pas encore testé, mais j'ai utilisé avec succès toutes ces fonctionnalités sauf rrsync.

Comment faire

  • créer une clé localement avec ssh-keygen(fonctionnalité openSSH)
  • autoriser la connexion uniquement avec cette clé spécifique, avec une entrée dans le serveur ~/.ssh/authorized_keys(fonctionnalité openSSH)
  • ~/.ssh/authorized_keysassociez cette clé à une commande spécifique, avec (fonctionnalité openSSH) en utilisant comme commande le script rrsyncdistribué avec rsync, quelque chose comme:command="$HOME/bin/rrsync -ro ~/backups/",no-agent-forwarding,no-port-forwarding,no-pty,no-user-rc,no-X11-

Ensuite, vous pouvez rsync du client normalement.

Si vous avez besoin de plus de détails

Restreindre l'accès SSH à rsync | Guy Rutenberg

Un pas au-delà du lien ci-dessus

La commande à la fin de cette page peut être raccourcie. Dans ~/.ssh/configcréer une strophe comme ceci:

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

alors votre commande rsync du client

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

devient

rsync -av user@remote: etc2/
Stéphane Gourichon
la source
1
Malheureusement, cela n’a rien à voir avec l’utilisation de rsync avec un serveur SFTP, il s’agit de configurer un serveur OpenSSH pour qu’il rsyncpuisse être exécuté, en contournant l’aspect SFTP. Si on vous présente le serveur SFTP de quelqu'un d'autre sur lequel vous n'avez aucun contrôle, cette réponse ne pourra pas résoudre le problème.
Malvineous
Vous avez raison. J'aurais peut-être écrit ceci pour répondre à une autre question et posté ici par erreur. J'envisage de retirer ma réponse ici.
Stéphane Gourichon