web-dev-qa-db-fra.com

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

Rsync sur ssh, fonctionne très bien à chaque fois.

Cependant, essayer de rsync vers un hôte qui autorise uniquement les connexions sftp, mais pas les connexions ssh, fournit l'erreur suivante:

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

incompatibilité 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) sur compat.c (171) [expéditeur = 3.0.6]

Voici la section pertinente de la page de manuel rsync:

Ce message est généralement provoqué par vos scripts de démarrage ou votre installation Shell distante produisant des déchets indésirables sur le flux que rsync utilise pour son transport. La façon de diagnostiquer ce problème consiste à exécuter votre shell distant comme ceci:

          ssh remotehost /bin/true > out.dat

puis regardez out.dat. Si tout fonctionne correctement, out.dat doit être un fichier de longueur nulle. Si vous obtenez l'erreur ci-dessus 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 les scripts de démarrage Shell mal configurés (tels que .cshrc ou .profile) qui contiennent des instructions de sortie pour les connexions non interactives.

L'essai 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.

Ce qui suit link montre qu'il est possible d'accomplir cette tâche en utilisant Fuse with sshfs - cependant il est extrêmement lent et ne convient pas à une utilisation en production.

Y a-t-il une chance de faire fonctionner rsync sftp?

61
Tom Feiner

Malheureusement pas directement. rsync nécessite un lien propre avec un shell qui lui permettra de démarrer la copie distante de rsync, lorsqu'elle est exécutée de cette façon.

Si vous avez un moyen d'exécuter des processus d'écoute de longue durée sur l'hôte, vous pouvez essayer de démarrer manuellement rsync en écoutant les connexions sur un port non privilégié, mais la plupart des techniques pour ce faire nécessiteront également un accès Shell correct via SSH, et il s'appuie sur les dispositions du pare-feu des hôtes permettant les connexions 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 au public (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 pour que les processus supplémentaires ne puissent pas être execed par les scripts utilisateur, alors vous pouvez essayer de démarrer rsync en mode d'écoute Si votre extrémité est connectable (vous exécutez SSH accessible au monde extérieur), vous pouvez essayer ceci à l'envers - demandez à un script d'exécuter rsync sur le serveur mais au lieu d'écouter les connexions entrantes, contactez votre service local et synchronisez Cela repose toujours sur l'installation effective de rsync sur l'hôte, ce qui n'est pas une donnée, ou sur le fait que vous pouvez télécharger une copie de travail, mais cela n'a pas les implications en termes de sécurité d'exécuter un démon rsync de manière adressable publiquement et de lui parler une chaîne non cryptée.

Déconner comme décrit ci-dessus peut être contraire aux politiques des hôtes, même si cela fonctionne, et pourrait vous faire démarrer. Il vaut mieux demander si un Shell complet peut être activé pour ce compte et abandonner rsync pour cet hôte ou abandonner cet hôte et se déplacer ailleurs s'il ne le fait pas.

39
David Spillett

Théoriquement, oui. Vous pouvez monter le système de fichiers distant sur votre machine locale en utilisant Fuse . Vous pouvez ensuite exécuter une copie locale de rsync entre le répertoire monté et le répertoire local. Je n'ai pas personnellement essayé cela, mais cela devrait fonctionner en théorie. Il serait probablement beaucoup moins efficace que d'effectuer la rsync sur SSH car il faudrait transférer au moins une partie de chaque fichier pour effectuer la comparaison.

20
Kamil Kisiel

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

lftp
~> open -u user,password sftp://Host.com
~> mirror remotedir outdir
~> quit
15
xioxox

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
6
jonathan

Option combinant le meilleur de tous

Il semble avoir les avantages suivants que d'autres réponses n'ont pas ici:

  • profite pleinement de SSH (sécurisé)
  • profite pleinement de rsync (protocole économe en bande passante, toutes les options rsync comme la limitation de la bande passante)
  • effectivement efficace (contrairement aux sshfs qui sauvent parfois les jours mais sont encore lents en 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 exécuter un démon rsync

Je ne l'ai pas encore testé, mais j'ai réussi à utiliser toutes ces fonctionnalités sauf rrsync.

Comment faire

  • créer une clé localement avec ssh-keygen (fonction openSSH)
  • autoriser la connexion uniquement avec cette clé spécifique, avec une entrée dans le serveur ~/.ssh/authorized_keys (fonction openSSH)
  • associez cette clé à une commande spécifique, avec ~/.ssh/authorized_keys (fonction openSSH) utilisant comme commande le script rrsync distribué 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/config créez une strophe comme celle-ci:

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

puis votre commande rsync du client

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

devient

rsync -av user@remote: etc2/
4

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

3

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

2
Dan Andreatta