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.


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.


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.


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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.