Jak korzystać z rsync przez FTP


187

Dowolny unix:

Mam następującą linię cmd, która działa dobrze.

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

Ale muszę go teraz skonfigurować, aby rsync był na zdalnym serwerze, który ma tylko serwer FTP. Jak mam to zrobić?

Spojrzałem na pomoc rsync, ale szybko się zgubiłem (nie robię tego zbyt często).


21
Jest to podobne do pytania, jak korzystać z HTTP przez IRC lub jak korzystać z FTP przez SMTP ...
Juliano

2
Może mógłbyś wyjaśnić niektóre z powodów, dla których chcesz to zrobić, to możemy pomóc Ci znaleźć realne rozwiązanie.
James

1
Zasadniczo próbowałem zautomatyzować tworzenie kopii zapasowej z udostępnionego serwera hostingowego i nie rozumiałem, jak działa rsync. przeniosłem się teraz na vps i nie mam już ograniczenia ftp
bumperbox

Podwójność jest twoim bogiem: scie.nti.st/2013/4/13/...
user956584

Jeśli wdrożenie jest, co masz na myśli, a nie masz nic przeciwko NodeJS, sprawdź dploy , leniwy i działa dobrze z git
Frank Nocke

Odpowiedzi:


78

Ty nie. rsync nie może tego zrobić dla ciebie, jest to własny protokół i nie działa przez FTP.

Możesz jednak spróbować csync . IIRC zapewnia zachowanie podobne do rsync przez HTTP. Nie mogę komentować, czy działa przez FTP, musisz spróbować.


1
Patrząc na stronę csync , obsługuje sftp, ale nie ma wzmianki o obsłudze zwykłego ftp.
Keith Thompson,

162

rsync nie będzie dla ciebie działał z powodów, o których wspominali inni. Jednak zarówno lftp, jak i ncftp mają tryby „lustrzane”, które prawdopodobnie spełnią twoje potrzeby.

Używam tego do wypychania rzeczy z mojego lokalnego katalogu do hosta ftp lub 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 jest bardzo fajny. innym, o wputktórym właśnie się dowiedziałem, jest wbudowane ograniczenie przepustowości.
karmakaze

122

Jak napisał sztaluga , lftpjest dobrym narzędziem.

Sugeruję sparametryzowanie skryptu i skorzystanie z niego

exclude-glob

opcje, które wykluczają nazwy plików za pomocą funkcji glob (* ,? ..) powłoki:

#!/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"

Ostrzeżenie: upewnij się, że katalog docelowy istnieje, w przeciwnym razie polecenie cd nie powiedzie się, więc operacja obejmująca usunięcie drzew plików nastąpi w niewłaściwym katalogu (root)!

Zaktualizowałem skrypt, aby --deleteopcja została wyłączona przez defaut, włącz ją, usuwając komentarz DELETE= command.


Pomógł mi świetny grono. Ale musiałem usunąć „set ftp: list-options -a;” gdzie bałagan.
mat

1
Czy istnieje coś takiego, co robi to samo w porównaniu z SFTP (FTPS?)?
trusktr

1
Zrobiłbym to wcześniej cd $RCD, aby zapobiec przypadkowemu usunięciu plików z niewłaściwego katalogu przez skrypt z literówką set cmd:fail-exit yes. (Wydaje się lftpnie zauważyć, że to faktycznie wyszedł, do czasu wydania następnego polecenia.) - I zanim cd $LCDbym to zrobić (w lokalnej powłoce, czyli w górnej części scrip) set -eu.
KajMagnus

3
Właściwie, kiedy uruchamiam skrypt po raz pierwszy, nie utworzyłem jeszcze katalogu zdalnego, więc skrypt nie zapisał się na CD w tym nieistniejącym katalogu. Następnie skrypt zaczął mirror, a tym samym --delete: d pliki z niewłaściwego katalogu. (Ale skopiowałem je ponownie, więc w tym przypadku nie miało to znaczenia. Być może ma to znaczenie dla kogoś innego.)
KajMagnus

1
Oprócz wskazówek @KajMagnus dotyczących używania „set -eu” i „cd $ LCD”, dodaj „mkdir -p $ LCD” przed „cd $ LCD” - w ten sposób możesz mieć pewność, że katalog istnieje, a ty ” jest w tym.
Paul Gear

25

W zależności od tego, co faktycznie próbujesz zrobić, curlftpsdo zamontowania folderu ftp można użyć innego całkowicie odmiennego podejścia , a następnie być może rsyncdwóch „lokalnych” folderów.

Instalacja różni się w zależności od twojej dystrybucji, więc nie mogę tego generalizować, ale musisz zainstalować fusei curlftpfs(Debly fuseinstaluje już domyślnie), a następnie:

  1. sudo apt-get install curlftpfs

  2. Upewnij się, że fusemoduł jest załadowany ( modprobe fuse)

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

Zauważ, że po ostatnim przecinku nie ma spacji (nie jest to literówka!). Jeśli jesteś z tego zadowolony lub nie chcesz tego robić za każdym razem, możesz dodać go do swojego fstab (zwykle w /etc/fstab):

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

W takim przypadku należy wcześniej upewnić się, że moduł bezpieczników jest załadowany.

Pamiętaj jednak o dwóch rzeczach:

  • Że deweloper porzucił projekt rok lub dwa lata temu, więc na razie nie wiem, jak użyteczna / stabilna.
  • Jeśli hasło zawiera dziwny znak, curlftpfsmoże się nie powieść (być może możesz coś z tym zrobić .netrc).

FTP Fuse i rsync są najbliżej pytania, ale wyraźnie szaleńczo na niczym innym, jak tylko małym zestawie małych plików.
Steve-o

1
Dlaczego to byłoby szalone? Domyślnie rsync stat () s nie porównuje zawartości. Można to zrobić przez ls -l z klientem ftp.
ptman

Właściwie próbowałem tego (przez rsnapshot) i to nie działało, każdy plik zwrócił się i wystąpił błąd, pokazując, że rsync nie mógł utworzyć łącza. Więc użycie lftp w połączeniu z rsnapshot załatwiło sprawę
Konstantin Pereiaslov

Bezbłędnie w 14.04 LTS; dodatkowa wskazówka: gdy jesteś gotowy, aby odmontować swoją witrynę FTP wystarczy użyć umount DIRgdzie DIRbył twój /path/to/ftp/folderpowyżej.
Joe

1
2017, a to wciąż działa! Szczerze mówiąc najprostszy sposób na skopiowanie plików z serwera FTP. Zamontuj lokalnie, a następnie rsync, jakby był lokalny
td512

16

Jest weex ...

Weex to narzędzie zaprojektowane do automatyzacji zadania zdalnego zarządzania stroną internetową lub innym archiwum FTP. Zsynchronizuje zestaw plików lokalnych ze zdalnym serwerem, wykonując przesyłanie i zdalne usuwanie zgodnie z wymaganiami.


2
Działa jak urok! Działasz tak: $ weex yourFTPconfigNameOto instrukcja linuxcertif.com/man/1/weex
sobi3ch 30.01.2015

9

rsync nie działa z ftp. Po drugiej stronie potrzebuje demona rsync lub powłoki, z której może wywoływać rsync. Ftp ogólnie pozwala na wywołanie kilku poleceń, a rsync nie jest jednym z nich. Istnieją inne narzędzia do automatyzacji zadań ftp, takie jak „lftp”.




5

Możesz użyć curlftpfs do zamontowania ftp i użyć rsync po http://linux.die.net/man/1/curlftpfs


Witamy w ServerFault! To może być dobry początek, ale uzasadnione może być trochę bardziej techniczne wyjaśnienie, dlaczego jest to lepsze podejście i być może próbka tego, jak to zrobić.
Scott Pack,

4

Używam GVFS / FTP. Montuję zdalne serwery FTP za pomocą gigolo. Ponieważ są one postrzegane jako katalogi lokalne, działa prawie wszystko, co działa na plikach lokalnych. rsync jest przeznaczony do zdalnego obliczania skrótów plików w celu porównywania plików bez ich przesyłania, ale robienie tego przy plikach wirtualnych powoduje ich przesyłanie. unison i freefilesync normalnie działają dobrze, ale napotkałem problem, gdy chcą zmienić nazwę pliku, który przesłałeś, bez problemu pobieranie. Może to być problem z gvfs 1.6.1.


3

Rozwiązanie Jonas S może być przydatne w zależności od okoliczności, na przykład jeśli masz dużą prędkość pobierania i powolne przesyłanie, sprawdzanie plików na serwerze może być stosunkowo szybsze niż niepotrzebne przesyłanie plików.

Prawdopodobnie chcesz jednak użyć CurlFTPFS: http://packages.ubuntu.com/search?suite=default§ion=all&arch=any&searchon=names&ke words=curlftpfs

Chociaż ogólnie lepiej jest używać zwykłego klienta FTP zamiast rsync.


2

Nie wierzę, że będziesz w stanie to zrobić, serwer, na którym próbujesz Rsync, będzie miał uruchomiony tylko serwer FTP, nie zrozumie poleceń, które wysyła go Rsync.

Jeśli chcesz to zrobić, ponieważ masz dostęp tylko do portu 21, ale masz kontrolę nad serwerem, możesz zmienić port, na którym nasłuchuje Rsync, na serwerze, ale jest to oczywiście przydatne tylko wtedy, gdy nie masz chcesz użyć FTP na tym porcie.


2

Jeśli chcesz zautomatyzować zadanie, skorzystaj z lftp, ponieważ możesz utworzyć skrypt, jak niektórzy napisali powyżej, możesz napisać to wszystko bardzo łatwo według własnych upodobań, jeśli szukasz rozwiązania jednorazowego (tj. Musisz pobrać całą stronę internetową) przez ftp / przenieś go na inny serwer) użyj ncftp, to proste, zainstaluj, jeśli nie jest jeszcze zainstalowane:

apt-get install ncftp

lub

yum install ncftp

(przepraszam, że dystrybucje nie oparte na Debianie / Red Hat ..)

po zainstalowaniu otwórz ncftp w terminalu, a następnie wpisz:

open -u ftpusername ftp.thedomain.com

Poprosi Cię o hasło, wprowadź je, a następnie:

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

Wykona resztę pracy za Ciebie ... powodzenia



0

Jest też wput:

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

Nazwa użytkownika i hasło są odczytywane z ~ / .netrc. W przeciwnym razie, jeśli nie jesteś szczególnie zainteresowany bezpieczeństwem, możesz podać je jako ftp: // nazwa użytkownika: hasło@target.host .


0

Stworzyłem do tego własne narzędzie wiersza polecenia: ftpsync

Dlaczego? Ponieważ jest prosty i elegancki, inne narzędzia wymagają wielu zależności, czasem kompilacji, czasem nie działają (np. Lftp na MacOs High Sierra). Fpspsc jest napisany w czystym Pythonie, nie wymaga bibliotek stron trzecich i jest mały, możesz po prostu dołączyć plik do swojego projektu.

Użycie: cd do katalogu projektu i wpisz:

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

--delete oznacza usuwanie zdalnych plików, które nie istnieją lokalnie.

Jeśli nie chcesz synchronizować, ale po prostu uruchom surowe polecenie ftp, użyj:

ftpsync -c '...'

Jest to przydatne w przypadku niektórych prostych operacji, takich jak wysyłanie pliku i zmiana jego nazwy:

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

Natknąłem się na to z tego samego powodu, co inni. Potrzeba dobrego narzędzia do synchronizacji przez protokół FTP. Twoje narzędzie wygląda dobrze, ale nie mogłem go użyć, ponieważ moim wymaganiem jest pobieranie ze zdalnego i synchronizowanie z lokalnym. Chcę uniknąć pobierania plików, które zostały już pobrane. Na poziomie lokalnym wykonuję przetwarzanie pobranych plików, co sprawia, że ​​się różnią; które należy pominąć przy następnym uruchomieniu skryptu FTP. W tej chwili trudno znaleźć rozwiązanie.
anup

Tak, właściwie to synchronizacja w jedną stronę.
superdario128,

0

rclone to ładne oprogramowanie, które wykonuje synchronizację katalogów przez ftp i wiele innych protokołów, w tym dostawców pamięci masowej w chmurze (Amazon S3, Dropbox, Dysk Google). Może synchronizować do / z dowolnej kombinacji pamięci lokalnej lub zdalnej.

Aby skonfigurować ftppilota, postępuj zgodnie z tymi instrukcjami .

Po zakończeniu operacji synchronizacji jest:

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

-7

Zainstaluj sftp, a następnie możesz użyć rsync.

Używam następującego.

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

7
To nie jest FTP, prawdopodobnie używa podsystemu sftp dla SSH (przynajmniej tak robi w domyślnej konfiguracji)
serverhorror

csync (sftp) i rsync mogą działać tak samo
Rajat
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.