FTP üzerinden rsync nasıl kullanılır


187

Herhangi bir unix:

İşe yarayan cmd çizgisine sahibim.

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

Ancak, üzerinde sadece bir FTP sunucusu bulunan uzak bir sunucuya rsync sağlamak için şimdi ayarlamam gerekiyor. Bu konuda nasıl giderim?

Rsync'in yardımına baktım ancak çabucak kayboldu (bu işleri çok sık yapmam).


21
Bu, IRC üzerinden HTTP'nin nasıl kullanıldığını veya SMTP üzerinden FTP'nin nasıl kullanıldığını sormaya benzer ...
Juliano

2
Belki bunu yapmak istemenizin gerekçelerinden bazılarını açıklayabilir, daha sonra uygun bir çözüm bulmanıza yardımcı olabiliriz.
James

1
temelde paylaşılan bir barındırma sunucusundan bir yedeklemeyi otomatikleştirmeye çalışıyordum ve rsync'in nasıl çalıştığını anlamadım. Ben şimdi bir vps taşındı ve artık ftp sınırlaması yok
bumperbox


Eğer dağıtım olduğunu ne aklında ve sen, NodeJS sakıncası bakmıyoruz dploy , tembel ve git ile iyi çalışıyor
Frank Nocke

Yanıtlar:


78

Sen değil. rsync bunu sizin için yapamaz, kendi başına bir protokoldür ve FTP üzerinden çalışmaz.

Bununla birlikte, csync'i denemek isteyebilirsiniz . IIRC, HTTP üzerinden rsync benzeri davranış sağlar. FTP üzerinden çalışıp çalışmadığını yorumlayamıyorum, denemek zorundasınız.


1
Csync web sayfasına bakıldığında sftp'yi destekler ancak düz ftp desteği yoktur.
Keith Thompson,

162

rsync , başkalarının söylediği nedenlerden dolayı sizin için çalışmayacak. Ancak, lftp ve ncftp , muhtemelen ihtiyaçlarınızı karşılayacak "ayna" modlarına sahiptir.

Bunu yerel dizinimden bir ftp veya sftp web ana bilgisayarına itmek için kullanıyorum:

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 çok hoş. az önce keşfettiğim diğer bir tanesi wputde yerleşik bant genişliği sınırlaması olan.
karmakaze

122

Şövale tarafından yazıldığı gibi , lftpiyi bir araçtır.

Senaryoyu parametreleştirmeni ve ondan faydalanmanı öneririm.

exclude-glob

Seçenekler, kabuğunuzun glob özelliğini (* ,? ..) kullanarak dosya adlarını hariç tutar:

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

Uyarı: Hedef dizinin var olduğundan emin olun, aksi takdirde cd komutu başarısız olur, bu nedenle dosya ağaçlarını silme işlemi yanlış dizinde (root) gerçekleşir!

Komut dosyasını güncelledim, böylece bu --deleteseçenek varsayılan olarak devre dışı bırakılır, yorum yazmadan etkinleştirilir DELETE= command.


Bana çok yardımcı oldu. Ama "set ftp: list-options -a;" kelimesini kaldırmak zorunda kaldım. Hangi yerleri karıştırıyorsun?
mat

1
SFTP (FTPS?) Üzerinde aynı şeyi yapan böyle bir şey var mı?
trusktr 14.03.2012

1
Bunu daha önce yapacağını cd $RCDkazara yanlış dizinden dosyaları silerek bir-komut-ile-yazım hatası önleyecek şekilde,: set cmd:fail-exit yes. (Öyle görünüyor lftpVe önce -. Bir sonraki komutu kadar, aslında çıkıldı olduğunu fark etmez) cd $LCD: Bunu yapacağını (yerel kabuk, o scrip üstündeki vardır) set -eu.
KajMagnus

3
Aslında, betiğimi ilk kez çalıştırdığımda, uzak dizini henüz oluşturmamıştım, bu yüzden komut dosyası mevcut olmayan dizine CD yazamadı. Sonra komut dosyası başladı mirrorve böylece --delete: d dosyaları yanlış dir. (Ama onları tekrar kopyaladım, bu yüzden bu önemli değildi. Belki başka biri için önemli.)
KajMagnus

1
'Set -eu' ve 'cd $ LCD' kullanımına ilişkin @KajMagnus 'tavsiyesini takip etmenin yanı sıra,' cd $ LCD 'den önce' mkdir -p $ LCD 'ekleyin - bu şekilde dizinin var olduğundan ve sizden emin olabilirsiniz' içinde.
Paul Gear

25

Gerçekten ne yapmaya çalıştığınıza bağlı olarak, curlftpsbir ftp klasörünü ve ardından belki rsyncde iki "yerel" klasörü bağlamak için tamamen farklı bir yaklaşım kullanmak olabilir .

Kurulum, dağıtımınıza bağlı olarak farklıdır, bu nedenle bu konuda genel bilgi edemiyorum, ancak yüklemeniz gerekir ( fuseve curlftpfsDebian'ın zaten fusevarsayılan olarak yüklediği), ardından:

  1. sudo apt-get install curlftpfs

  2. fuseModülün yüklendiğinden emin olun ( modprobe fuse)

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

Son virgülden sonra boşluk olmadığına dikkat edin (bu bir yazım hatası değil!). Bundan memnunsanız veya bunu her zaman yapmak istemiyorsanız, fstab'ınıza ekleyebilirsiniz (genellikle içinde /etc/fstab):

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

Bu durumda, sigorta modülünün önceden yüklendiğinden emin olmalısınız.

Yine de iki şeyden haberdar olun:

  • Geliştiricinin projeyi bir veya iki yıl önce düşürdüğü için şu an için ne kadar kullanışlı / kararlı olduğunu bilmiyorum.
  • Eğer şifre tuhaf bir karakter içeriyorsa curlftpfsbaşarısız olabilir (belki ile bir şeyler yapabilirsiniz .netrc).

FTP Fuse ve rsync, soruya en yakın olanıdır ancak küçük bir grup küçük dosyadan başka bir şey için açıkça delilik.
Steve-o

1
Neden delilik olsun ki? Varsayılan olarak rsync stat () s, içeriği karşılaştırmaz. Bir ftp istemcisiyle ls -l ile yapılabilir.
ptman

Aslında bunu denedim (rsnapshot aracılığıyla) ve işe yaramadı, her dosya geri döndü ve rsync'in link oluşturamayacağını gösteren hata verdi. Yani rsnapshot ile birlikte lftp kullanarak hile yaptı
Konstantin Pereiaslov

14.04 LTS'de Kusursuz; ek bir ipucu: FTP sitenizi çıkarmaya hazır olduğunuzda sadece yukarıdakilerin umount DIRnerede DIRolduğunu kullanın /path/to/ftp/folder.
Joe

1
2017 ve bu hala çalışıyor! Bir FTP sitesinden dosya kopyalamanın en kolay yolu. Yerel olarak
bağla

16

Orada weex ...

Weex, bir web sayfasını veya başka bir FTP arşivini uzaktan koruma görevini otomatikleştirmek için tasarlanmış bir yardımcı programdır. Yüklemeler ve uzaktan silmeleri gerektiği şekilde gerçekleştirerek bir dizi yerel dosyayı uzak sunucuya senkronize eder.


2
Cazibe gibi çalışıyor! Bu şekilde çalıştırıyorsunuz: $ weex yourFTPconfigNameBurada manuel bağlantı linuxcertif.com/man/1/weex
sobi3ch

9

rsync ftp üzerinde çalışmıyor. Uzak tarafta rsync daemonuna veya rsync'i çağırabildiği bir kabuğa ihtiyacı var. Ftp genellikle birkaç komut çağırmanıza izin verir ve rsync onlardan biri değildir. "Lftp" gibi ftp görevlerini otomatikleştirmek için kullanılan başka araçlar da vardır.




5

Sen ftp montaj ve sonra rsync'i kullanmaya curlftpfs kullanabilirsiniz http://linux.die.net/man/1/curlftpfs


ServerFault'a Hoşgeldiniz! Bu iyi bir başlangıç ​​olabilir, ancak bunun neden daha iyi bir yaklaşım olduğu ve belki de bunun nasıl yapılacağına dair sahte bir yaklaşım olarak bazı teknik detaylar makul olabilir.
Scott Pack

4

GVFS / FTP kullanıyorum. Uzak FTP sunucularını gigolo ile monte ediyorum. Yerel dizinler olarak görüldüğü gibi yerel dosyalar üzerinde çalışan hemen hemen her şey çalışır. rsync, dosyaları aktarmadan dosyaları karşılaştırmak için uzaktan dosya karmalarını hesaplamak için tasarlanmıştır, ancak bunu sanal dosyalarla yapmak da dosyaları yine de aktarır. unison ve freefilesync normalde iyi çalışır, ancak yüklediğiniz dosyayı yeniden adlandırmak istediklerinde bir sorunla karşılaştım. Bu gvfs 1.6.1 ile bir sorun olabilir.


3

Jonas S'ın çözümü, duruma bağlı olarak yararlı olabilir, örneğin yüksek bir indirme hızına ve yavaş bir yüklemeye sahipseniz, sunucudaki dosyaları kontrol etmek gereksiz yere dosya yüklemekten nispeten daha hızlı olabilir.

Olsa da, muhtemelen CurlFTPFS kullanmak istersiniz: http://packages.ubuntu.com/search?suite=default§ion=all&arch=any&searchon=names&keywords=curlftpfs

Her ne kadar genel olarak, normal bir FTP istemcisini rsync yerine tamamen kullanmak daha iyidir.


2

Bunu yapabileceğinizi sanmıyorum, Rsync'e çalıştığınız sunucu yalnızca çalışan bir FTP sunucusuna sahip olacak, Rsync'in gönderdiği komutları anlamayacak.

Bunu yapmak istemenizin nedeni, yalnızca 21 numaralı bağlantı noktasına erişiminizin olması, ancak sunucunun denetimine sahip olmanızdıysa, Rsync'in dinlediği bağlantı noktasını sunucuda değiştirebilirsiniz; FTP'yi bu portta kullanmak istiyorum.


2

Görevi otomatikleştirmek istiyorsanız, lftp'yi kullanın, çünkü bazı kişilerin yukarıda yayınladığı gibi bir komut dosyası oluşturabilirsiniz, istediğiniz gibi kolayca kolayca komut dosyası oluşturabilirsiniz, eğer bir kerelik bir çözüm arıyorsanız (yani bir web sitesinin tamamını indirmeniz gerekiyorsa) ftp ile / başka bir sunucuya taşıyın) ncftp kullanın, basittir, eğer kurulmamışsa kurun:

apt-get install ncftp

veya

yum install ncftp

(üzgünüm debian / red hat tabanlı dağıtımlar ..)

kurulduktan sonra, ncftp'yi terminalde açın ve sonra şunu yazın:

open -u ftpusername ftp.thedomain.com

Sizden parolayı soracak, girecek ve ardından:

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

İşin geri kalanını sizin için halleder .. iyi şanslar



0

Bir de wput var:

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

Kullanıcı adı ve şifre ~ / .netrc adresinden okunur. Aksi takdirde, özellikle güvenlikten endişe duymuyorsanız, onları ftp: // username: password@target.host .


0

Bunun için kendi komut satırı aracını yaptım : ftpsync

Neden? Basit ve zarif olduğu için, diğer araçlar bazen derleme, bazen çalışmaz (örneğin MacO’s High Sierra’da). Ftpsync saf Python ile yazılmıştır, 3. parti libleri gerektirmez ve küçüktür, sadece projenize dahil edebilirsiniz.

Kullanım: Proje dizininize cd ve yazın:

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

--delete yerel olarak bulunmayan uzaktaki dosyaları silmek için kullanılır.

Eğer senkronize etmek istemiyorsanız ancak sadece ham ftp komutunu çalıştırın:

ftpsync -c '...'

Dosya gönderme ve yeniden adlandırma gibi bazı basit işlemler için kullanışlıdır:

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

Başkalarının yaptığı gibi aynı nedenden dolayı bunun üzerine tökezledi. FTP protokolü üzerinden iyi bir senkronizasyon programı için bir ihtiyaç. Aracınız iyi görünüyor, ancak benim isteğim uzaktan kumandadan indirilip yerel ile senkronize edilmesi gerektiği için kullanamadım. İndirilmiş dosyaları indirmekten kaçınmak istiyorum. Yerelde, farklı kılan indirilen dosyalar üzerinde işlem yapıyorum; FTP betiği bir daha çalıştırıldığında bu atlanmalıdır. Şu anda zor zaman bir çözüm bulmak.
anup

Evet, aslında tek yönlü bir senkronizasyon.
superdario128 19.03.2018

0

rclone ftp üzerinden bulut senkronizasyonu sağlayıcıları (Amazon S3, Dropbox, Google Drive) dahil olmak üzere birçok protokolde dizin senkronizasyonu yapan hoş bir yazılımdır. Herhangi bir yerel veya uzak depolama birleşiminden senkronize edebilir.

ftpUzaktan kumanda kurmak için bu talimatları izleyin .

Bu yapıldıktan sonra senkronizasyon işlemi şöyledir:

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

-7

Sftp'yi kurun ve ardından rsync'i kullanabilirsiniz.

Aşağıdakileri kullanıyorum.

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

7
Yani değil (en azından o varsayılan yapılandırmasında yaptığı şey) muhtemelen SSH iç sftp alt sistemi kullanan FTP
serverhorror

csync (sftp) ve rsync aynı şekilde çalışabilir
Rajat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.