Como fazer upload de um diretório recursivamente para um servidor FTP usando apenas ftp ou lftp?

19

Estou escrevendo um script de shell do Linux para copiar um diretório local para um servidor remoto (removendo todos os arquivos existentes).

Servidor local: ftp e lftpcomandos estão disponíveis, nenhuma ncftp ou nenhuma ferramenta gráfica.

Servidor remoto: acessível apenas via FTP. Não rsync, nem SSH, nem FXP.

Estou pensando em listar arquivos locais e remotos para gerar um script lftp e depois executá-lo. Existe uma maneira melhor?

Nota: Carregar apenas arquivos modificados seria uma vantagem, mas não é obrigatório.

Nicolas Raoul
fonte
ncftp está totalmente fora de questão? Seria mais fácil imho. (e eu sei que ele vai fazê-lo como eu usá-lo dessa forma)
Sirex
Sirex: Prefiro fazê-lo com ferramentas fornecidas por padrão no RedHat. Se o lftp for inutilizável, adicionarei um requisito para os usuários instalarem o ncftp.
Nicolas Raoul
A sintaxe para wput(um ftp-uploader semelhante ao wget):wput dir/ ftp://user:pass@host/dir
kenorb 7/15

Respostas:

39

O lftp deve ser capaz de fazer isso em uma única etapa, em particular com lftp mirror:

EDIT: a sintaxe do comando lftp é confusa, a invocação original que publiquei não funciona. Tente assim:

lftp -e "espelho -R {diretório local} {diretório remoto}" -u {nome de usuário}, {senha} {host}

observe as aspas ao redor dos argumentos para o -ecomutador.

Phil Hollenback
fonte
1
+1 por me informar que o modo espelho do lftp funciona mesmo que o FXP não esteja disponível (fiquei convencido do contrário depois de ler tutorials.papamike.ca/pub/lftp.html, que diz "os dois servidores devem suportar este protocolo para que esta operação seja bem-sucedida "). No entanto, este comando específico falha no meu servidor Ubuntu: lftp: mirror: Nome ou serviço desconhecido, comando desconhecido `-R '.
Nicolas Raoul
Eu reformulei minha resposta com uma melhor invocação do lftp, espero que ajude.
Phil Hollenback
Finalmente consegui que funcionasse! Parece que você deve alternar entre remoto e local para que funcione. Atualize e eu aceitarei esta resposta. Aqui está uma linha de comando que funciona: lftp -e "mirror -R / tmp / mylocalfiles / var / www" -u remoteuser, remotepassword remoteserver
Nicolas Raoul
Acho que vi nos documentos do lftp que você tinha que trocar os diretórios locais e remotos ao usar -R, mas devo ter esquecido. Atualizei minha resposta.
Phil Hollenback
Como isso falha? Você já tentou executar o 'lftp -vvv' para obter uma saída mais detalhada para determinar o que está tentando fazer?
Phil Hollenback
1

Baseado na idéia de Phil de usar o modo espelho do lftp, este comando faz o truque:

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

Uma desvantagem é que exige que o servidor local tenha um servidor FTP em execução.

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

Isso funcionou para mim, muitas outras tentativas falharam. Uma vez no lftp, mais informações estão disponíveis em:

help mput
Austin
fonte
2
Provavelmente seria melhor usar mirror -Raqui.
gauteh
@gauteh você está certo. melhor resposta ^
austin
0

Finalmente consegui a resposta !!! Criar script de shell ftpmirror.sh

#!/bin/bash 
path = /local-dir-path
lftp -e "mirror -R $path /$path" -u username,password ftp-server-ip
  • Path = diretório local que queremos copiar no servidor ftp
  • nome de usuário = nome de usuário do servidor ftp
  • password = senha do servidor ftp
  • ftp-server-ip = endereço IP do servidor ftp

Se o pacote lftp não estiver instalado, instale-o usando o yum.

Kiran Zinjurde
fonte