¿Cómo subir un directorio de forma recursiva a un servidor FTP simplemente usando ftp o lftp?

19

Estoy escribiendo un script de shell de Linux para copiar un directorio local a un servidor remoto (eliminando cualquier archivo existente).

Servidor local: ftp y los lftpcomandos están disponibles, no hay ncftp ni herramientas gráficas.

Servidor remoto: solo accesible a través de FTP. Sin rsync ni SSH ni FXP.

Estoy pensando en enumerar archivos locales y remotos para generar un script lftp y luego ejecutarlo. ¿Hay una mejor manera?

Nota: Cargar solo archivos modificados sería una ventaja, pero no es obligatorio.

Nicolas Raoul
fuente
ncftp está totalmente fuera de la cuestión? Sería más fácil en mi humilde opinión. (y sé que lo hará como lo uso de esa manera)
Sirex
Sirex: Prefiero hacerlo con herramientas que vienen por defecto en RedHat. Si lftp resulta inutilizable, agregaré un requisito para que los usuarios instalen ncftp.
Nicolas Raoul
La sintaxis para wput(a wget-como ftp-Registro):wput dir/ ftp://user:pass@host/dir
kenorb

Respuestas:

39

lftp debería poder hacer esto en un solo paso, en particular con lftp mirror:

EDITAR: la sintaxis del comando lftp es confusa, la invocación original que publiqué no funciona. Pruébalo así:

lftp -e "espejo -R {directorio local} {directorio remoto}" -u {nombre de usuario}, {contraseña} {host}

tenga en cuenta las citas alrededor de los argumentos para el -ecambio.

Phil Hollenback
fuente
1
+1 por informarme que el modo espejo de lftp funciona incluso si FXP no está disponible (estaba convencido de lo contrario después de leer tutorials.papamike.ca/pub/lftp.html que dice "ambos servidores deben admitir este protocolo para que esta operación tenga éxito "). Sin embargo, este comando en particular falla en mi servidor Ubuntu: lftp: mirror: Nombre o servicio desconocido, comando desconocido `-R '.
Nicolas Raoul
Reescribí mi respuesta con una mejor invocación de lftp, espero que eso ayude.
Phil Hollenback
¡Finalmente lo tengo para trabajar! Parece que debe cambiar remoto y local para que funcione. Actualice y aceptaré esta respuesta. Aquí hay una línea de comando que funciona: lftp -e "mirror -R / tmp / mylocalfiles / var / www" -u remoteuser, remotepassword remoteserver
Nicolas Raoul
Creo que vi en los documentos lftp que tenía que cambiar los directorios locales y remotos cuando usaba -R, pero debo haberlo olvidado. Actualicé mi respuesta.
Phil Hollenback
¿Cómo falla? ¿Has intentado ejecutar 'lftp -vvv' para obtener una salida más detallada para determinar qué está tratando de hacer?
Phil Hollenback
1

Basado en la idea de Phil de usar el modo espejo de lftp, este comando hace el truco:

lftp -c 'open -e "mirror /tmp/thedir ftp://nico:mypass@remotehost/~/destination/" ftp://nico:mypass@localhost'

Un inconveniente es que requiere que el servidor local tenga un servidor FTP en ejecución.

Nicolas Raoul
fuente
1
cd {local_dir}
lftp {server}
cd {remote_dir}
mput {local_dir}/*

Esto funcionó para mí, muchos otros intentos estaban fallando. Una vez en lftp, hay más información disponible a través de:

help mput
austin
fuente
2
Probablemente sería mejor usar mirror -Raquí.
Gauteh
@gauteh tienes razón. mejor respuesta ^
austin
0

Finalmente obtuve la respuesta !!! Crear script de shell ftpmirror.sh

#!/bin/bash 
path = /local-dir-path
lftp -e "mirror -R $path /$path" -u username,password ftp-server-ip
  • Ruta = directorio local que queremos copiar en el servidor ftp
  • nombre de usuario = nombre de usuario del servidor ftp
  • contraseña = contraseña del servidor ftp
  • ftp-server-ip = dirección IP del servidor ftp

Si el paquete lftp no está instalado, se instala usando yum.

Kiran Zinjurde
fuente