Comment utiliser rsync sur FTP


187

Unix quelconque:

J'ai la ligne suivante de cmd qui fonctionne bien.

rsync -avr -e ssh /home/dir user@example.com:/home/

Mais je dois le configurer maintenant pour rsync sur un serveur distant qui ne dispose que d’un serveur FTP. Comment vais-je à ce sujet?

J'ai regardé l'aide de rsync mais je me suis vite perdu (je ne fais pas ce genre de choses très souvent).


21
Cela revient à demander comment utiliser HTTP sur IRC ou FTP sur SMTP ...
Juliano

2
Peut-être pourriez-vous expliquer certains de vos arguments en faveur de cette démarche, nous pourrons alors vous aider à trouver une solution viable.
James

1
Essentiellement, j'essayais d'automatiser une sauvegarde à partir d'un serveur d'hébergement partagé, sans comprendre le fonctionnement de rsync. je suis passé à un vps maintenant, et n'ai plus la limitation de ftp
bumperbox

La duplicité est votre dieu: scie.nti.st/2013/4/13/…
user956584

Si le déploiement est, ce qui est sur votre esprit, et ne vous dérange pas NodeJS, consultez dploy , paresseux et fonctionne bien avec git
Frank Nocke

Réponses:


78

Vous pas. rsync ne peut pas le faire pour vous, c'est un protocole qui lui est propre et qui ne fonctionne pas par FTP.

Cependant, vous voudrez peut-être essayer csync . IIRC fournit un comportement de type rsync sur HTTP. Je ne peux pas dire si cela fonctionne via FTP, vous devrez l'essayer.


1
En regardant la page Web csync , il supporte sftp mais il n’ya aucune mention de support pour plain ftp.
Keith Thompson

162

rsync ne fonctionnera pas pour vous pour les raisons que d'autres ont mentionnées. Cependant, lftp et ncftp ont tous deux un mode "miroir" qui répondra probablement à vos besoins.

J'utilise ceci pour transférer des éléments de mon répertoire local vers un hôte Web ftp ou sftp:

lftp -c "set ftp:list-options -a;
open ftp://user:password@your.ftp.com; 
lcd ./web;
cd /web/public_html;
mirror --reverse --delete --use-cache --verbose --allow-chown  
--allow-suid --no-umask --parallel=2 --exclude-glob .svn"

2
lftp est très gentil. Un autre que je viens de découvrir est wputqui a la limitation de bande passante intégrée.
Karmakaze

122

Comme écrit par le chevalet , lftpest un bon outil.

Je vous suggère de paramétrer le script et d’utiliser le

exclude-glob

options, qui exclut les noms de fichiers utilisant la fonction glob (* ,? ..) de votre shell:

#!/bin/bash    
HOST="your.ftp.host.dom"
USER="username"
PASS="password"
FTPURL="ftp://$USER:$PASS@$HOST"
LCD="/path/of/your/local/dir"
RCD="/path/of/your/remote/dir"
#DELETE="--delete"
lftp -c "set ftp:list-options -a;
open '$FTPURL';
lcd $LCD;
cd $RCD;
mirror --reverse \
       $DELETE \
       --verbose \
       --exclude-glob a-dir-to-exclude/ \
       --exclude-glob a-file-to-exclude \
       --exclude-glob a-file-group-to-exclude* \
       --exclude-glob other-files-to-exclude"

Avertissement: assurez-vous que le répertoire cible existe, sinon la commande cd échouera. Par conséquent, les opérations, y compris la suppression des arborescences de fichiers, seront exécutées dans un répertoire incorrect (racine)!

J'ai mis à jour le script pour que cette --deleteoption soit désactivée par défaut, activez-la en retirant le commentaire DELETE= command.


M'a aidé un bon groupe. Mais je devais supprimer le "set ftp: list-options -a;" qui où gâcher des choses.
mat

1
Y a-t-il quelque chose comme ça qui fait la même chose avec SFTP (FTPS?)?
trusktr

1
Je le faire avant cd $RCD, afin d'éviter un script avec-une-typo de la suppression accidentelle des fichiers du mauvais répertoire: set cmd:fail-exit yes. (Il semble lftpne pas remarquer qu'il a effectivement quitté, jusqu'à ce que vous émettez la commande suivante.) - Et avant que cd $LCDje fais (dans la coquille locale, qui est, au sommet du scrip): set -eu.
KajMagnus

3
En fait, la première fois que j'exécutais mon script, je n'avais pas encore créé le répertoire distant. Le script a donc échoué sur CD-ROM dans ce répertoire non existant. Ensuite, le script a commencé à mirror, et donc --delete: d les fichiers du mauvais répertoire. (Mais je les ai copiées à nouveau, donc dans ce cas, cela importait peu. Peut-être que ça importait pour quelqu'un d'autre.)
KajMagnus

1
En plus de suivre les conseils de @KajMagnus sur l'utilisation de 'set -eu' et de 'cd $ LCD', ajoutez 'mkdir -p $ LCD' avant 'cd $ LCD' - ainsi, vous pourrez être sûr que le répertoire existe et vous ' re dedans.
Paul Gear

25

Selon ce que vous essayez réellement de faire, une autre approche complètement différente pourrait être utilisée curlftpspour monter un dossier ftp, et peut rsync- être ensuite les deux dossiers "locaux".

L’installation étant différente selon votre distribution, je ne peux donc pas généraliser, mais vous devez installer fuseet curlftpfs(Debly a déjà fuseinstallé Debian par défaut), puis:

  1. sudo apt-get install curlftpfs

  2. Assurez-vous que le fusemodule est chargé ( modprobe fuse)

  3. sudo curlftpfs ftp.yourserver.com /path/to/ftp/folder/ -o user=username:password,allow_other

Notez qu'il n'y a pas d'espace après la dernière virgule (ce n'est pas une faute de frappe!). Si vous êtes satisfait de cela ou si vous ne voulez pas le faire à chaque fois, vous pouvez l'ajouter à votre fstab (généralement dans /etc/fstab):

curlftpfs#user:password@ftp.yourserver.com /path/to/ftp/folder/ fuse auto,user,uid=1000,allow_other 0 0

Dans ce cas, vous devez vous assurer que le module de fusible est chargé avant.

Soyez avisé de deux choses:

  • Le développeur a abandonné le projet il y a un ou deux ans, donc je ne sais pas comment il est utilisable / stable pour le moment.
  • Si le mot de passe contient un caractère étrange curlftpfspourrait échouer (peut-être que vous pouvez faire quelque chose avec le .netrc).

FTP Fuse et rsync sont très proches de la question, mais manifestement insensés pour tout sauf un petit ensemble de petits fichiers.
Steve-o

1
Pourquoi serait-il fou? Par défaut, rsync stat (), il ne compare pas le contenu. Cela peut être fait par ls -l avec un client ftp.
ptman

En fait, j'ai essayé cela (via rsnapshot) et cela n'a pas fonctionné, chaque fichier renvoyé avec une erreur indiquant que rsync ne pouvait pas créer de lien. Donc, en utilisant lftp en conjonction avec rsnapshot a fait le tour
Konstantin Pereiaslov

Sans faille sur 14.04 LTS; Un conseil supplémentaire: lorsque vous êtes prêt à démonter votre site FTP, utilisez simplement umount DIRDIRétait votre /path/to/ftp/folderdessus.
Joe

1
2017, et ça marche encore! Honnêtement, le moyen le plus simple de copier des fichiers depuis un site FTP enmasse. Montez localement, puis rsynchronisez comme si c'était local
td512

16

Il y a weex ...

Weex est un utilitaire conçu pour automatiser la tâche de maintenance à distance d'une page Web ou d'une autre archive FTP. Il synchronisera un ensemble de fichiers locaux sur un serveur distant en effectuant des téléchargements et des suppressions à distance, selon les besoins.


2
Fonctionne comme un charme! Vous $ weex yourFTPconfigNamele lancez
sobi3ch

9

rsync ne fonctionne pas sur ftp. Du côté distant, il lui faut soit le démon rsync, soit un shell à partir duquel il peut appeler rsync. Ftp vous permet généralement d’appeler quelques commandes et rsync n’en fait pas partie. Il existe d'autres outils destinés à automatiser des tâches ftp tels que "lftp".




5

Vous pouvez utiliser curlftpfs pour monter ftp et utiliser rsync après http://linux.die.net/man/1/curlftpfs


Bienvenue sur ServerFault! Cela peut être un bon début, mais des détails plus techniques expliquant pourquoi il s’agit d’une meilleure approche, et éventuellement d’une maquette sur la façon de le faire, pourraient être raisonnables.
Scott Pack

4

J'utilise GVFS / FTP. Je monte mes serveurs FTP distants avec gigolo. Comme ils sont vus comme des répertoires locaux, presque tout ce qui fonctionne sur des fichiers locaux fonctionne. rsync est conçu pour calculer les hachages de fichiers à distance afin de comparer des fichiers sans les transférer, mais le faire avec des fichiers virtuels les transfère quand même. unison et freefilesync fonctionnent normalement bien, mais j'ai rencontré un problème lorsqu'ils veulent renommer un fichier téléchargé, pas de problème de téléchargement. Ceci pourrait être un problème avec gvfs 1.6.1.


3

La solution de Jonas S peut être utile selon les circonstances. Par exemple, si vous avez une vitesse de téléchargement élevée et un téléchargement lent, la vérification des fichiers sur le serveur peut s'avérer relativement plus rapide que le téléchargement inutile de fichiers.

Vous voudrez probablement utiliser CurlFTPFS, cependant: http://packages.ubuntu.com/search?suite=default§ion=all&arch=any&searchon=names&keywords=curlftpfs

Bien qu'en règle générale, il vaut mieux utiliser un client FTP ordinaire plutôt que rsync.


2

Je ne crois pas que vous pourrez faire cela, le serveur que vous essayez de faire fonctionner avec Rsync ne fera qu'exécuter un serveur FTP, il ne comprendra pas les commandes envoyées par Rsync.

Si vous voulez faire cela, c'est que vous n'avez accès qu'au port 21, mais que vous avez le contrôle du serveur, vous pouvez modifier le port que Rsync écoute, sur le serveur, mais cela n'est évidemment utile que si vous ne le faites pas. vouloir utiliser FTP sur ce port.


2

Si vous souhaitez automatiser la tâche, utilisez lftp, car vous pouvez créer un script comme certains l’ont indiqué ci-dessus. Vous pouvez également écrire le script à votre guise, si vous recherchez une solution unique (c’est-à-dire que vous devez télécharger un site Web entier. via ftp / déplacez-le sur un autre serveur) utilisez ncftp, son simple, installez-le s'il n'est pas déjà installé:

apt-get install ncftp

ou

yum install ncftp

(désolé distributions non debian / à chapeau rouge ..)

une fois installé, ouvrez ncftp dans le terminal puis tapez:

open -u ftpusername ftp.thedomain.com

Il vous demandera le mot de passe, entrez-le, puis:

get -R /home/remotewebsite/public_html/ /home/localwebsite/public_html/

Ça fera le reste du travail pour vous .. bonne chance



0

Il y a aussi wput:

wput --timestamping --reupload --dont-continue source-files ftp://target.host/dir

Le nom d'utilisateur et le mot de passe sont lus depuis ~ / .netrc. Sinon, si vous n'êtes pas particulièrement concerné par la sécurité, vous pouvez les fournir sous la forme ftp: // nom d'utilisateur: password@target.host .


0

J'ai créé mon propre outil de ligne de commande pour cela: ftpsync

Pourquoi? Parce qu’il est simple et élégant, d’autres outils nécessitent beaucoup de dépendances, parfois la compilation, parfois ne fonctionne pas (par exemple, lftp sur MacOs High Sierra). Ftpsync est écrit en Python pur, ne nécessite pas de bibliothèque tierce partie et c'est petit, vous pouvez simplement inclure le fichier dans votre projet.

Utilisation: cd dans le répertoire de votre projet et tapez:

ftpsync user:pass@ftp.address.url/remote/dir --delete

--delete signifie supprimer des fichiers distants qui n'existent pas localement.

Si vous ne voulez pas synchroniser mais simplement lancer une commande ftp brute, utilisez:

ftpsync -c '...'

C'est utile pour des opérations simples comme envoyer un fichier et le renommer:

ftpsync -c 'PASV; TYPE I; STOR some_file.ext; RNFR some_file.ext; RNTO some_file_renamed.ext'

Nous sommes tombés dessus pour la même raison que d’autres. Besoin d'un bon utilitaire de synchronisation via le protocole FTP. Votre outil a l'air bien, mais je ne pouvais pas le mettre à profit, car je souhaite télécharger à distance et synchroniser avec local. Je veux éviter de télécharger des fichiers déjà téléchargés. En local, je traite les fichiers téléchargés, ce qui les rend différents; cela devrait être ignoré à la prochaine exécution du script FTP. Pour le moment, difficile de trouver une solution.
Anup

Oui, en fait, c'est une synchronisation à sens unique.
Superdario128

0

rclone est un logiciel qui effectue la synchronisation d'annuaire via FTP et de nombreux autres protocoles, y compris les fournisseurs de stockage en cloud (Amazon S3, Dropbox, Google Drive). Il peut se synchroniser vers / depuis toute combinaison de stockage local ou distant.

Pour installer une ftptélécommande, suivez ces instructions .

Une fois que cela est fait, l'opération de synchronisation est la suivante:

rclone sync /home/dir FTP_REMOTE:/home --progress 

-7

Installez sftp et vous pourrez utiliser rsync.

J'utilise le suivant.

rsync --delete --times --recursive --perms --owner --group --verbose --progress --stats -e ssh root@192.168.0.100:/folder1/ /folder2/

7
Ce n'est pas FTP, il utilise probablement le sous-système sftp interne à SSH (du moins c'est ce qu'il fait dans la configuration par défaut)
serverhorror

csync (sftp) et rsync peuvent être la même façon de travailler
Rajat
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.