Como usar o rsync sobre FTP


187

Qualquer unix:

Eu tenho a seguinte linha de cmd que funciona bem.

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

Mas preciso configurá-lo agora para rsync em um servidor remoto que tenha apenas um servidor FTP. Como eu faço isso?

Eu olhei para a ajuda do rsync, mas rapidamente me perdi (eu não faço essas coisas com muita frequência).


21
Este é o mesmo que pedir como usar HTTP sobre IRC, ou como usar FTP sobre SMTP ...
Juliano

2
Talvez você possa explicar alguns dos seus motivos para querer fazer isso, então podemos ajudá-lo a encontrar uma solução viável.
James

11
essencialmente, eu estava tentando automatizar um backup de um servidor de hospedagem compartilhada e não entendia como o rsync funcionava. i mudaram-se para um VPS agora, e não têm a limitação de ftp mais
bumperbox

A duplicidade é seu deus: scie.nti.st/2013/4/13/…
user956584

Se implantação é, o que está em sua mente, e você não se importa NodeJS, veja dploy , preguiçoso e funciona bem com git
Frank Nocke

Respostas:


78

Você não O rsync não pode fazer isso por você, é um protocolo próprio e não funciona via FTP.

Você pode, no entanto, querer experimentar o csync . IIRC fornece comportamento semelhante ao rsync sobre HTTP. Não posso comentar se funciona via FTP, você terá que tentar.


11
Olhando para a página da web csync , ele suporta sftp, mas não há menção de suporte para ftp simples.
9788 Keith Thompson

162

O rsync não funcionará para você pelas razões que outras pessoas mencionaram. No entanto, lftp e ncftp têm modos "espelho" que provavelmente atenderão às suas necessidades.

Eu uso isso para enviar coisas do meu diretório local para um host 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
O lftp é muito bom. outro que eu acabei de descobrir é wputque tem limitação de largura de banda embutida.
Karmakaze 17/07/2013

122

Como escrito por cavalete , lftpé uma boa ferramenta.

Sugiro que você parametrize o script e faça uso do

exclude-glob

opções, que exclui nomes de arquivos usando o recurso glob (* ,? ..) do seu 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"

Aviso: verifique se o diretório de destino existe; caso contrário, o comando cd falhará; portanto, a operação incluindo a exclusão de árvores de arquivos ocorrerá no diretório errado (raiz)!

Eu atualizei o script para que a --deleteopção seja desabilitada por padrão, habilite-o descomentando o DELETE= command.


Me ajudou muito. Mas tive que remover o "set ftp: list-options -a;" que estragando tudo.
mat

11
Existe algo assim que faz a mesma coisa com SFTP (FTPS?)?
trusktr

11
Eu faria isso antes cd $RCD, de modo a impedir que um script-com-a-typo a exclusão acidental de arquivos do diretório errado: set cmd:fail-exit yes. (Parece que lftpnão percebe que ele realmente saiu, até que você emitir o próximo comando.) - E antes de cd $LCDeu fazer isso (no shell local, ou seja, no topo do scrip): set -eu.
KajMagnus

3
Na verdade, na primeira vez em que executo meu script, eu ainda não havia criado o diretório remoto; portanto, o script falhou ao colocar o CD no diretório inexistente. Então o script começou a mirror, e assim --delete: d arquivos do diretório errado. (Mas eu copiei-los de volta, então, nesse caso, não importava Talvez isso é importante para alguém..)
KajMagnus

11
Além de seguir os conselhos do @KajMagnus sobre o uso de 'set -eu' e 'cd $ LCD', adicione 'mkdir -p $ LCD' antes de 'cd $ LCD' - para garantir que o diretório exista e você ' re nele.
Paul Engrenagem

25

Dependendo do que você está realmente tentando fazer, outra abordagem completamente diferente pode ser usada curlftpspara montar uma pasta ftp e, talvez, rsyncas duas pastas "locais".

A instalação é diferente dependendo da sua distribuição, então não posso generalizar isso, mas você precisa instalar fusee curlftpfs(prolly o Debian já possui a fuseinstalação por padrão), então:

  1. sudo apt-get install curlftpfs

  2. Verifique se o fusemódulo está carregado ( modprobe fuse)

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

Observe que não há espaço após a última vírgula (não é um erro de digitação!). Se você estiver satisfeito com isso ou não quiser fazer isso sempre, adicione-o ao seu fstab (geralmente em /etc/fstab):

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

Nesse caso, você deve garantir que o módulo de fusível esteja carregado antes.

Esteja ciente de duas coisas:

  • Que o desenvolvedor abandonou o projeto um ou dois anos atrás, então não sei como utilizável / estável no momento.
  • Se a senha contiver um caractere estranho, curlftpfspoderá falhar (talvez você possa fazer algo com o .netrc).

O FTP Fuse e o rsync são os mais próximos da pergunta, mas claramente insanos em tudo, menos em um pequeno conjunto de arquivos pequenos.
Steve-o

11
Por que seria insano? Por padrão rsync stat () s, ele não compara o conteúdo. Isso pode ser feito por ls -l com um cliente ftp.
ptman

Na verdade, eu tentei isso (via rsnapshot) e não funcionou, cada arquivo retornado e com erro, mostrando que o rsync não conseguiu criar um link. Então, usando lftp em conjunto com rsnapshot fez o truque
Konstantin Pereiaslov

Sem falhas em 14.04 LTS; Uma dica adicional: quando você estiver pronto para desmontar seu site FTP usar simplesmente umount DIRonde DIRestava seu /path/to/ftp/folderacima.
Joe Joe

11
2017, e isso ainda funciona! Honestamente, a maneira mais fácil de copiar arquivos de um site FTP é enmasse. Monte localmente, em seguida, rsync como se fosse local
td512

16

weex ...

O Weex é um utilitário projetado para automatizar a tarefa de manter remotamente uma página da web ou outro arquivo FTP. Ele sincronizará um conjunto de arquivos locais com um servidor remoto, executando uploads e exclusões remotas, conforme necessário.


2
Funciona como charme! Você está executando assim: $ weex yourFTPconfigNameAqui está o manual linuxcertif.com/man/1/weex
sobi3ch 30/01

9

O rsync não funciona sobre ftp. No lado remoto, ele precisa do daemon rsync ou de um shell do qual possa chamar rsync. O FTP geralmente permite que você chame alguns comandos e o rsync não é um deles. Existem outras ferramentas destinadas a automatizar tarefas ftp como "lftp".




5

Você pode usar curlftpfs para montar o ftp e usar o rsync após http://linux.die.net/man/1/curlftpfs


Bem-vindo ao ServerFault! Esse pode ser um bom começo, mas alguns detalhes mais técnicos sobre o porquê de uma abordagem melhor e, possivelmente, uma simulação de como fazê-lo, podem ser razoáveis.
Scott pacote de

4

Estou usando GVFS / FTP. Eu monto meus servidores FTP remotos com gigolo. Como eles são vistos como diretórios locais, quase tudo funciona nos arquivos locais. O rsync foi projetado para calcular remotamente hashes de arquivos para comparar arquivos sem transferi-los, mas fazer isso com arquivos virtuais transfere os arquivos de qualquer maneira. uníssono e freefilesync normalmente funcionam bem, mas encontrei um problema quando eles querem renomear um arquivo carregado, sem problemas ao fazer o download. Isso pode ser um problema com o gvfs 1.6.1.


3

A solução do Jonas S pode ser útil dependendo da circunstância, por exemplo, se você tiver uma alta velocidade de download e upload lento, a verificação dos arquivos no servidor pode ser relativamente mais rápida do que o upload desnecessário de arquivos.

Você provavelmente deseja usar o CurlFTPFS: http://packages.ubuntu.com/search?suite=default§ion=all&arch=any&searchon=names&keywords=curlftpfs

Embora, geralmente, seja melhor usar um cliente FTP normal em vez do rsync.


2

Eu não acredito que você será capaz de fazer isso, o servidor para o qual você está tentando fazer o Rsync terá apenas um servidor FTP em execução, ele não entenderá os comandos que o Rsync está enviando.

Se o motivo para fazer isso é que você só tem acesso à porta 21, mas tem controle do servidor, pode alterar a porta que o Rsync escuta, no servidor, mas obviamente isso só será útil se você não tiver deseja usar o FTP nessa porta.


2

Se você deseja automatizar a tarefa e usar o lftp, pois pode criar um script como algumas pessoas postaram acima, é possível criar um script de maneira muito fácil ao seu gosto, se estiver procurando uma solução única (ou seja, você precisa baixar um site inteiro via ftp / mova-o para outro servidor) use ncftp, é simples, instale-o se ainda não estiver instalado:

apt-get install ncftp

ou

yum install ncftp

(desculpe distros não baseados em debian / red hat ..)

uma vez instalado, abra o ncftp no terminal e digite:

open -u ftpusername ftp.thedomain.com

Ele solicitará a senha, digite-a e depois:

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

Fará o resto do trabalho para você .. boa sorte



0

Há também wput:

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

O nome de usuário e a senha são lidos em ~ / .netrc. Caso contrário, se você não estiver particularmente preocupado com a segurança, poderá fornecê-los como ftp: // nome do usuário: senha@target.host .


0

Eu fiz a própria ferramenta de linha de comando para isso: ftpsync

Por quê? Por ser simples e elegante, outras ferramentas exigem muitas dependências, às vezes compilando, às vezes não funcionam (por exemplo, lftp no MacOs High Sierra). O ftpsync é escrito em Python puro, não requer bibliotecas de terceiros e é pequeno, basta incluir o arquivo no seu projeto.

Uso: cd no diretório do projeto e digite:

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

--delete significa excluir arquivos remotos que não existem localmente.

Se você não deseja sincronizar, mas apenas executar o comando raw ftp, use:

ftpsync -c '...'

É útil para algumas operações simples, como enviar arquivo e renomeá-lo:

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

Tropeçou nisso devido à mesma razão que os outros. Necessidade de um bom utilitário de sincronização através do protocolo FTP. Sua ferramenta parece boa, mas eu não consegui usá-la, pois meu requisito é fazer o download do remoto e sincronizar com o local. Quero evitar o download de arquivos que já foram baixados. No local, faço um processamento nos arquivos baixados, o que os diferencia; que deve ser ignorado na próxima vez que o script FTP for executado. No momento difícil encontrar uma solução.
anup

Sim, na verdade é uma sincronização unidirecional.
Superdario128

0

O rclone é um bom software que sincroniza diretórios por ftp e muitos outros protocolos, incluindo provedores de armazenamento em nuvem (Amazon S3, Dropbox, Google Drive). Pode sincronizar de / para qualquer combinação de armazenamento local ou remoto.

Para configurar um ftpcontrole remoto, siga estas instruções .

Feito isso, a operação de sincronização é:

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

-7

Instale o sftp e então você pode usar o rsync.

Eu uso o seguinte.

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

7
Isso é não FTP provavelmente usa o subsistema sftp interno para SSH (pelo menos é o que ele faz na configuração padrão)
serverhorror

csync (SFTP) e rsync pode ser a mesma forma de trabalhar
Rajat
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.