Cómo usar rsync sobre FTP

187

Cualquier unix:

Tengo la siguiente línea de cmd que funciona bien.

rsync -avr -e ssh /home/dir [email protected]:/home/

Pero necesito configurarlo ahora para rsync a un servidor remoto que solo tiene un servidor FTP. ¿Cómo hago para eso?

Miré la ayuda de rsync pero rápidamente me perdí (no hago esto muy a menudo).

bumperbox
fuente
21
Esto es similar a preguntar cómo usar HTTP sobre IRC, o cómo usar FTP sobre SMTP ...
Juliano
2
Tal vez podría explicar algunos de sus razonamientos para querer hacer esto, luego podemos ayudarlo a encontrar una solución viable.
James
1
esencialmente estaba tratando de automatizar una copia de seguridad desde un servidor de alojamiento compartido, y no entendía cómo funcionaba rsync. Me mudé a un vps ahora, y ya no tengo la limitación de ftp
bumperbox
La duplicidad es tu dios: scie.nti.st/2013/4/13/…
user956584
Si la implementación es, lo que está pensando, y no le importa NodeJS, consulte dploy , perezoso y funciona bien con git
Frank Nocke

Respuestas:

78

Usted no rsync no puede hacer eso por usted, es un protocolo propio y no funciona a través de FTP.

Sin embargo, es posible que desee probar csync . IIRC proporciona un comportamiento similar a rsync a través de HTTP. No puedo comentar si funciona a través de FTP, tendrás que probarlo.

servidorhorror
fuente
1
Mirando la página web csync , es compatible con sftp pero no se menciona la compatibilidad con ftp simple.
Keith Thompson
162

rsync no va a funcionar para usted por las razones que otros han mencionado. Sin embargo, lftp y ncftp tienen modos "espejo" que probablemente satisfagan sus necesidades.

Lo uso para enviar cosas desde mi directorio local a un servidor web ftp o sftp:

lftp -c "set ftp:list-options -a;
open ftp://user:[email protected]; 
lcd ./web;
cd /web/public_html;
mirror --reverse --delete --use-cache --verbose --allow-chown  
--allow-suid --no-umask --parallel=2 --exclude-glob .svn"
caballete
fuente
2
LFTP es muy agradable. Otro que acabo de descubrir es el wputque tiene un límite de ancho de banda incorporado.
karmakaze
122

Según lo escrito por caballete , lftpes una buena herramienta.

Le sugiero que parametrice el guión y utilice el

exclude-glob

opciones, que excluye los nombres de archivo utilizando la función global (* ,? ..) de su 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"

Advertencia: asegúrese de que exista el directorio de destino, de lo contrario, el comando cd fallará, por lo que la operación, incluida la eliminación de árboles de archivos, se realizará en el directorio incorrecto (raíz).

He actualizado el script para que esa --deleteopción esté deshabilitada por defecto, habilítela descomentando el DELETE= command.

GabrieleV
fuente
Me ayudó mucho. Pero tuve que eliminar el "set ftp: list-options -a;" que donde arruinaban las cosas.
mat
1
¿Hay algo como esto que haga lo mismo sobre SFTP (FTPS?)?
trusktr
1
Me gustaría hacer esto antes cd $RCD, a fin de evitar un script-con-un-error tipográfico de la eliminación accidental de archivos desde el directorio equivocado: set cmd:fail-exit yes. (Parece que lftpno se da cuenta de que en realidad ha salido, hasta que emita el siguiente comando.) - Y antes de cd $LCDque me gustaría hacer esto (en la cáscara local, es decir, en la parte superior de la alforja): set -eu.
KajMagnus
3
En realidad, la primera vez que ejecuté mi script, todavía no había creado el directorio remoto, por lo que el script no pudo CD en ese directorio no existente. Entonces el script comenzó a mirror, y por lo tanto --delete: d archivos del directorio incorrecto. (Pero los volví a copiar, así que en ese caso no importó. Quizás sea importante para otra persona.)
KajMagnus
1
Además de seguir los consejos de @KajMagnus sobre el uso de 'set -eu' y 'cd $ LCD', agregue 'mkdir -p $ LCD' antes de 'cd $ LCD', de esa manera puede estar seguro de que el directorio existe y usted ' re en ella.
Paul Gear
25

Dependiendo de lo que realmente esté tratando de hacer, podría utilizarse otro enfoque completamente diferente curlftpspara montar una carpeta ftp, y luego tal vez rsynclas dos carpetas "locales".

La instalación es diferente dependiendo de su distribución, por lo que no puedo generalizar sobre eso, pero necesita instalar fusey curlftpfs(prolly Debian ya tiene la fuseinstalación por defecto), entonces:

  1. sudo apt-get install curlftpfs

  2. Asegúrese de que el fusemódulo esté cargado ( modprobe fuse)

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

Tenga en cuenta que no hay espacio después de la última coma (¡no es un error tipográfico!). Si está satisfecho con eso o no quiere hacer eso cada vez, puede agregarlo a su fstab (generalmente en /etc/fstab):

curlftpfs#user:[email protected] /path/to/ftp/folder/ fuse auto,user,uid=1000,allow_other 0 0

En ese caso, debe asegurarse de que el módulo de fusibles esté cargado antes.

Sin embargo, tenga en cuenta dos cosas:

  • Que el desarrollador abandonó el proyecto hace uno o dos años, por lo que no sé qué tan utilizable / estable por el momento.
  • Si la contraseña contiene un carácter extraño curlftpfspodría fallar (tal vez pueda hacer algo con el .netrc).
Pablo Olmos de Aguilera C.
fuente
FTP Fuse y rsync es lo más cercano a la pregunta, pero claramente loco en cualquier cosa que no sea un pequeño conjunto de archivos pequeños.
Steve-o
1
¿Por qué sería una locura? Por defecto rsync stat () s, no compara el contenido. Eso lo puede hacer ls -l con un cliente ftp.
ptman
Realmente intenté esto (a través de rsnapshot) y no funcionó, cada archivo devuelto y error, mostrando que rsync no podía crear un enlace. Así que usar lftp junto con rsnapshot hizo el truco
Konstantin Pereiaslov
Impecable en 14.04 LTS; Un consejo adicional: cuando esté listo para desmontar su sitio FTP, simplemente use umount DIRdonde DIRestaba el /path/to/ftp/folderanterior.
Joe
1
2017, y esto todavía funciona! Honestamente, la forma más fácil de copiar archivos de un sitio FTP en masa. Montar localmente, luego rsync como si fuera local
td512
16

Hay weex ...

Weex es una utilidad diseñada para automatizar la tarea de mantener remotamente una página web u otro archivo FTP. Sincronizará un conjunto de archivos locales a un servidor remoto realizando cargas y eliminaciones remotas según sea necesario.

Johan
fuente
2
Funciona como encanto! Lo está ejecutando así: $ weex yourFTPconfigNameaquí está el manual linuxcertif.com/man/1/weex
sobi3ch
9

rsync no funciona sobre ftp. En el lado remoto, necesita el demonio rsync o un shell desde el que pueda llamar a rsync. Ftp generalmente le permite llamar a algunos comandos y rsync no es uno de ellos. Hay otras herramientas destinadas a automatizar tareas ftp como "lftp".

Ian Kelling
fuente
5

Puede usar curlftpfs para montar ftp y usar rsync después de http://linux.die.net/man/1/curlftpfs

shaftmx
fuente
¡Bienvenido a ServerFault! Este puede ser un buen comienzo, pero algunos detalles más técnicos sobre por qué este es un mejor enfoque, y posiblemente una maqueta sobre cómo hacerlo, podrían ser razonables.
Scott Pack
4

Estoy usando GVFS / FTP. Monto mis servidores FTP remotos con gigolo. Como se ven como directorios locales, casi todo lo que funciona en archivos locales funciona. rsync está diseñado para calcular hashes de archivos de forma remota para comparar archivos sin transferirlos, pero hacerlo con archivos virtuales transfiere los archivos de todos modos. Unison y Freefilesync normalmente funcionan bien, pero encontré un problema cuando quieren cambiar el nombre de un archivo que has subido, no hay problema para descargar. Esto podría ser un problema con gvfs 1.6.1.

Papou
fuente
3

La solución de Jonas S puede ser útil dependiendo de las circunstancias, por ejemplo, si tiene una alta velocidad de descarga y carga lenta, verificar los archivos en el servidor podría ser relativamente más rápido que cargar archivos innecesariamente.

Sin embargo, es probable que desee utilizar CurlFTPFS: http://packages.ubuntu.com/search?suite=default§ion=all&arch=any&searchon=names&keywords=curlftpfs

Aunque, en general, es mejor usar un cliente FTP normal en lugar de rsync.

Peter Mortensen
fuente
2

No creo que pueda hacer esto, el servidor al que está tratando de Rsync solo tendrá un servidor FTP en ejecución, no entenderá los comandos que Rsync lo está enviando.

Si la razón por la que desea hacer esto es que solo tiene acceso al puerto 21, pero tiene el control del servidor, puede cambiar el puerto en el que escucha Rsync, en el servidor, pero esto obviamente solo es útil si no desea usar FTP en ese puerto.

Sam Cogan
fuente
2

Si desea automatizar la tarea, use lftp, ya que puede crear un script como algunas personas han publicado anteriormente, puede hacerlo todo muy fácilmente a su gusto, si está buscando una solución única (es decir, necesita descargar un sitio web completo a través de ftp / moverlo a otro servidor) use ncftp, es simple, instálelo si aún no está instalado:

apt-get install ncftp

o

yum install ncftp

(lo siento, distribuciones no debian / red hat basadas)

una vez instalado, abra ncftp en la terminal y luego escriba:

open -u ftpusername ftp.thedomain.com

Le pedirá la contraseña, ingrésela y luego:

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

Hará el resto del trabajo por ti ... buena suerte

desdecode
fuente
0

También hay wput:

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

El nombre de usuario y la contraseña se leen desde ~ / .netrc. De lo contrario, si no está particularmente preocupado por la seguridad, puede proporcionarlos como ftp: // username: [email protected] .

Ole Wolf
fuente
0

Hice mi propia herramienta de línea de comandos para eso: ftpsync

¿Por qué? Debido a que es simple y elegante, otras herramientas requieren muchas dependencias, a veces compilar, a veces no funciona (por ejemplo, lftp en MacOs High Sierra). Ftpsync está escrito en Python puro, no requiere librerías de terceros y es pequeño, solo puede incluir el archivo en su proyecto.

Uso: cd a su directorio de proyecto y escriba:

ftpsync user:[email protected]/remote/dir --delete

--delete significa eliminar archivos remotos que no existen localmente.

Si no desea sincronizar pero simplemente ejecuta el comando ftp sin procesar, use:

ftpsync -c '...'

Es útil para algunas operaciones simples como enviar archivos y renombrarlos:

ftpsync -c 'PASV; TYPE I; STOR some_file.ext; RNFR some_file.ext; RNTO some_file_renamed.ext'
superdario128
fuente
Tropecé con esto debido a la misma razón que otros. La necesidad de una buena utilidad de sincronización a través del protocolo FTP. Su herramienta se ve bien, pero no pude usarla, ya que mi requisito es descargarla de forma remota y sincronizarla con local. Quiero evitar descargar archivos que ya están descargados. En local hago un procesamiento en los archivos descargados que lo hace diferente; eso debería omitirse la próxima vez que se ejecute el script FTP. Por el momento es difícil encontrar una solución.
anup
Sí, en realidad es una sincronización unidireccional.
superdario128
0

rclone es una buena pieza de software que realiza la sincronización de directorios a través de ftp y muchos otros protocolos, incluidos los proveedores de almacenamiento en la nube (Amazon S3, Dropbox, Google Drive). Se puede sincronizar con / desde cualquier combinación de almacenamiento local o remoto.

Para configurar un ftpcontrol remoto, siga estas instrucciones .

Una vez hecho esto, la operación de sincronización es:

rclone sync /home/dir FTP_REMOTE:/home --progress 
bernie
fuente
-7

Instale sftp y luego puede usar rsync.

Yo uso el siguiente.

rsync --delete --times --recursive --perms --owner --group --verbose --progress --stats -e ssh [email protected]:/folder1/ /folder2/
Rajat
fuente
77
Es decir , no FTP es probable que utiliza el subsistema SFTP interno para SSH (al menos eso es lo que hace en la configuración por defecto)
serverhorror
csync (sftp) y rsync pueden ser la misma forma de trabajar
Rajat