Come usare rsync su FTP


187

Qualsiasi unix:

Ho la seguente linea cmd che funziona bene.

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

Ma devo configurarlo ora per sincronizzare un server remoto che ha solo un server FTP. Come posso procedere?

Ho guardato l'aiuto di rsync ma mi sono perso rapidamente (non faccio queste cose molto spesso).


21
È simile a chiedere come usare HTTP su IRC o come usare FTP su SMTP ...
Juliano

2
Forse potresti spiegare alcuni dei tuoi ragionamenti per voler fare questo, quindi possiamo aiutarti a trovare una soluzione praticabile.
James,

1
essenzialmente stavo cercando di automatizzare un backup da un server di hosting condiviso e non capivo come funzionasse rsync. sono passato a un vps ora e non ho più la limitazione di ftp
bumperbox

Duplicity is your god: scie.nti.st/2013/4/13/…
user956584

Se la distribuzione è, cosa ti passa per la testa e non ti dispiace NodeJS, controlla dploy , pigro e funziona bene con git
Frank Nocke,

Risposte:


78

Non rsync non può farlo per te, è un protocollo a sé stante e non funziona su FTP.

Tuttavia, potresti voler provare csync . IIRC fornisce un comportamento simile a rsync su HTTP. Non posso commentare se funziona tramite FTP, dovrete provarlo.


1
Guardando la pagina web csync , supporta sftp ma non si fa menzione del supporto per ftp semplice.
Keith Thompson,

162

rsync non funzionerà per te per i motivi che altri hanno menzionato. Tuttavia, lftp e ncftp hanno entrambi modalità "mirror" che probabilmente soddisfano le tue esigenze.

Lo uso per inviare roba dalla mia directory locale a un host web ftp o 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
lftp è molto carino. un altro che ho appena scoperto è wputche ha un limite di larghezza di banda integrato.
karmakaze,

122

Come scritto da cavalletto , lftpè un buon strumento.

Ti suggerisco di parametrizzare lo script e di utilizzare il

exclude-glob

opzioni, che esclude i nomi di file usando la funzione glob (* ,? ..) della 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"

Attenzione: assicurarsi che la directory di destinazione esista, altrimenti il ​​comando cd fallirà, quindi l'operazione inclusa l'eliminazione di alberi di file avverrà nella directory sbagliata (root)!

Ho aggiornato lo script in modo tale che l' --deleteopzione sia disabilitata da defaut, abilitala decommentando il file DELETE= command.


Mi ha aiutato moltissimo. Ma ho dovuto rimuovere il "set ftp: list-options -a;" quale dove fare casino.
mat

1
C'è qualcosa del genere che fa la stessa cosa su SFTP (FTPS?)?
trusktr,

1
Vorrei farlo prima cd $RCD, in modo da evitare un-script-con-un-errore di battitura dalla cancellazione accidentale di file dalla directory sbagliata: set cmd:fail-exit yes. (Sembra lftpnon si accorge che è in realtà uscito, fino a quando si esegue il comando successivo.) - E prima cd $LCDche avrei fatto questo (nella shell locale, cioè, nella parte superiore del The Script): set -eu.
KajMagnus,

3
In realtà, la prima volta che eseguo il mio script, non avevo ancora creato la directory remota, quindi lo script non è riuscito a CD in quella directory inesistente. Quindi lo script ha iniziato a mirror, e quindi --delete: d file dalla directory sbagliata. (Ma li ho copiati di nuovo, quindi in quel caso non aveva importanza. Forse è importante per qualcun altro.)
KajMagnus,

1
Oltre a seguire i consigli di @KajMagnus sull'uso di 'set -eu' e 'cd $ LCD', aggiungi 'mkdir -p $ LCD' prima di 'cd $ LCD' - in questo modo puoi essere sicuro che la directory esista e tu ' re in esso.
Paul Gear

25

A seconda di ciò che stai effettivamente cercando di fare, un altro approccio completamente diverso potrebbe essere usato curlftpsper montare una cartella ftp, e quindi forse rsyncle due cartelle "locali".

L'installazione è diversa a seconda della tua distribuzione, quindi non posso generalizzare su questo, ma è necessario installare fusee curlftpfs( fuseper impostazione predefinita Debian ha già installato di default), quindi:

  1. sudo apt-get install curlftpfs

  2. Assicurarsi che il fusemodulo sia caricato ( modprobe fuse)

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

Nota che non c'è spazio dopo l'ultima virgola (non è un refuso!). Se sei soddisfatto o non vuoi farlo ogni volta, puoi aggiungerlo al tuo fstab (di solito in /etc/fstab):

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

In tal caso, è necessario assicurarsi che il modulo fusibili sia stato caricato prima.

Tieni presente, però, di due cose:

  • Che lo sviluppatore ha abbandonato il progetto uno o due anni fa, quindi non so quanto sia utilizzabile / stabile per il momento.
  • Se la password contiene un carattere strano curlftpfspotrebbe non riuscire (forse puoi fare qualcosa con il .netrc).

FTP Fuse e rsync sono i più vicini alla domanda, ma chiaramente pazzi per tutto tranne che un piccolo set di piccoli file.
Steve-o

1
Perché sarebbe folle? Di default rsync stat () s, non confronta i contenuti. Questo può essere fatto da ls -l con un client ftp.
ptman,

In realtà ho provato questo (tramite rsnapshot) e non ha funzionato, ogni file è tornato ed errore, mostrando che rsync non è stato in grado di creare un collegamento. Quindi usare lftp insieme a rsnapshot ha fatto il trucco
Konstantin Pereiaslov,

Perfetta su 14.04 LTS; un ulteriore suggerimento: quando sei pronto a smontare il tuo sito FTP, usa semplicemente umount DIRdove si DIRtrovava /path/to/ftp/foldersopra.
Joe,

1
2017, e funziona ancora! Sinceramente il modo più semplice per copiare file da un sito FTP. Montare localmente, quindi rsync come se fosse locale
td512

16

C'è weex ...

Weex è un'utilità progettata per automatizzare l'attività di gestione remota di una pagina Web o di un altro archivio FTP. Sincronizzerà un set di file locali su un server remoto eseguendo upload ed eliminazioni remote come richiesto.


2
Funziona come il fascino! Lo stai eseguendo in questo modo: $ weex yourFTPconfigNameecco il manuale linuxcertif.com/man/1/weex
sobi3ch

9

rsync non funziona su ftp. Sul lato remoto ha bisogno del demone rsync o di una shell da cui può chiamare rsync. Ftp generalmente ti permette di chiamare alcuni comandi e rsync non è uno di questi. Esistono altri strumenti pensati per automatizzare le attività ftp come "lftp".




5

Puoi usare curlftpfs per montare ftp e usare rsync dopo http://linux.die.net/man/1/curlftpfs


Benvenuti in ServerFault! Questo potrebbe essere un buon inizio, ma alcuni dettagli più tecnici sul perché si tratta di un approccio migliore, e forse un modello su come farlo, potrebbero essere ragionevoli.
Scott Pack

4

Sto usando GVFS / FTP. Monta i miei server FTP remoti con gigolo. Come sono visti come directory locali, quasi tutto funziona su file locali funziona. rsync è progettato per calcolare gli hash di file in remoto per confrontare i file senza trasferirli, ma farlo con i file virtuali trasferisce comunque i file. unison e freefilesync normalmente funzionano bene ma ho riscontrato un problema quando vogliono rinominare un file che hai caricato, nessun problema con il download. Questo potrebbe essere un problema con gvfs 1.6.1.


3

La soluzione di Jonas S può essere utile a seconda delle circostanze, ad esempio se si dispone di un'alta velocità di download e di un caricamento lento, il controllo dei file sul server potrebbe essere relativamente più veloce del caricamento inutile di file.

Probabilmente vuoi usare CurlFTPFS, però: http://packages.ubuntu.com/search?suite=default§ion=all&arch=any&searchon=names&keywords=curlftpfs

Sebbene, in generale, è meglio utilizzare un normale client FTP del tutto invece di rsync.


2

Non credo che sarai in grado di farlo, il server a cui stai provando Rsync avrà solo un server FTP in esecuzione, non capirà i comandi che Rsync lo sta inviando.

Se il motivo per cui vuoi farlo è che hai accesso solo alla porta 21, ma hai il controllo del server, puoi cambiare la porta su cui Rsync è in ascolto, sul server, ma questo è ovviamente utile solo se non lo fai vuoi usare FTP su quella porta.


2

Se vuoi automatizzare l'attività, allora usa lftp poiché puoi creare uno script come alcune persone hanno pubblicato sopra, puoi scriverlo tutto molto facilmente a tuo piacimento, se stai cercando una soluzione unica (cioè devi scaricare un intero sito web via ftp / spostalo su un altro server) usa ncftp, è semplice, installalo se non è già installato:

apt-get install ncftp

o

yum install ncftp

(scusate le distribuzioni non debian / red hat based)

una volta installato, apri ncftp nel terminale quindi digita:

open -u ftpusername ftp.thedomain.com

Ti chiederà la password, inseriscila e quindi:

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

Farà il resto del lavoro per te ... buona fortuna



0

C'è anche wput:

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

Il nome utente e la password vengono letti da ~ / .netrc. Altrimenti, se non sei particolarmente interessato alla sicurezza, puoi fornirli come ftp: // username: password@target.host .


0

Ho creato il proprio strumento da riga di comando per quello: ftpsync

Perché? Poiché è semplice ed elegante, altri strumenti richiedono molte dipendenze, a volte la compilazione, a volte non funziona (ad esempio lftp su MacOs High Sierra). Ftpsync è scritto in puro Python, non richiede librerie di terze parti ed è piccolo, puoi semplicemente includere il file nel tuo progetto.

Utilizzo: cd nella directory del progetto e digitare:

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

--delete indica l'eliminazione di file remoti che non esistono localmente.

Se non vuoi sincronizzare ma esegui il comando raw ftp usa:

ftpsync -c '...'

È utile per alcune semplici operazioni come inviare file e rinominarlo:

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

Ci siamo imbattuti in questo a causa della stessa ragione degli altri. Necessità di una buona utilità di sincronizzazione tramite protocollo FTP. Il tuo strumento ha un bell'aspetto, ma non sono riuscito a utilizzarlo, dal momento che il mio requisito è di scaricare da remoto e sincronizzare con locale. Voglio evitare di scaricare file già scaricati. Sul locale eseguo un'elaborazione sui file scaricati che lo differenzia; che dovrebbe essere ignorato alla successiva esecuzione dello script FTP. Al momento è difficile trovare una soluzione.
fino al

Sì, in realtà è la sincronizzazione unidirezionale.
superdario128

0

rclone è un bel software che esegue la sincronizzazione delle directory su ftp e molti altri protocolli tra cui i provider di cloud storage (Amazon S3, Dropbox, Google Drive). Può sincronizzarsi con / da qualsiasi combinazione di archiviazione locale o remota.

Per configurare un ftptelecomando seguire queste istruzioni .

Una volta fatto, l'operazione di sincronizzazione è:

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

-7

Installa sftp e quindi puoi usare rsync.

Io uso il seguente.

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

7
Questo non è FTP, probabilmente usa il sottosistema sftp interno a SSH (almeno è quello che fa nella configurazione predefinita)
serverhorror

csync (sftp) e rsync possono essere lo stesso modo di lavorare
Rajat,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.