Cara menggunakan rsync melalui FTP

187

Segala penyatuan:

Saya memiliki baris cmd berikut yang berfungsi dengan baik.

rsync -avr -e ssh /home/dir [email protected]:/home/

Tetapi saya perlu mengaturnya sekarang untuk rsync ke server jauh yang hanya memiliki server FTP di atasnya. Bagaimana saya melakukannya?

Saya melihat bantuan rsync tetapi dengan cepat tersesat (saya tidak sering melakukan hal ini).

bumperbox
sumber
21
Hal ini mirip dengan bertanya bagaimana menggunakan HTTP melalui IRC, atau bagaimana menggunakan FTP lebih SMTP ...
Juliano
2
Mungkin Anda bisa menjelaskan beberapa alasan Anda ingin melakukan ini, maka kami dapat membantu Anda menemukan solusi yang layak.
James
1
pada dasarnya saya mencoba untuk mengotomatiskan cadangan dari server hosting bersama, dan tidak mengerti bagaimana rsync bekerja. saya telah pindah ke vps sekarang, dan tidak memiliki batasan ftp lagi
bumperbox
Duplicity adalah tuhan Anda: scie.nti.st/2013/4/13/…
user956584
Jika penyebaran , apa yang ada di pikiran Anda, dan Anda tidak keberatan NodeJS, periksa dploy , malas dan bekerja dengan baik dengan git
Frank Nocke

Jawaban:

78

Kamu tidak. rsync tidak bisa melakukan itu untuk Anda, itu adalah protokolnya sendiri dan tidak berfungsi melalui FTP.

Anda mungkin ingin mencoba csync . IIRC menyediakan perilaku seperti rsync melalui HTTP. Saya tidak dapat mengomentari apakah itu berfungsi melalui FTP, Anda harus mencobanya.

serverhorror
sumber
1
Melihat halaman web csync , ia mendukung sftp tetapi tidak disebutkan dukungan untuk ftp biasa.
Keith Thompson
162

rsync tidak akan bekerja untuk Anda karena alasan yang disebutkan orang lain. Namun, lftp dan ncftp keduanya memiliki mode "mirror" yang mungkin akan memenuhi kebutuhan Anda.

Saya menggunakan ini untuk mendorong barang-barang dari direktori lokal saya ke host web ftp atau sftp:

lftp -c "set ftp:list-options -a;
open ftp://user:[email protected]; 
lcd ./web;
cd /web/public_html;
mirror --reverse --delete --use-cache --verbose --allow-chown  
--allow-suid --no-umask --parallel=2 --exclude-glob .svn"
kuda-kuda
sumber
2
lftp sangat bagus. satu lagi saya baru tahu tentang wputyang memiliki batas bandwidth built-in.
karmakaze
122

Seperti yang ditulis oleh kuda-kuda , lftpadalah alat yang bagus.

Saya sarankan Anda untuk menentukan parameter skrip, dan memanfaatkan

exclude-glob

opsi, yang mengecualikan nama file menggunakan fitur glob (* ,? ..) dari shell Anda:

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

Peringatan: pastikan bahwa direktori target ada, jika tidak perintah cd akan gagal, jadi operasi termasuk menghapus pohon file akan terjadi di direktori yang salah (root)!

Saya telah memperbarui skrip sehingga --deleteopsi dinonaktifkan oleh defaut, aktifkan dengan menghapus komentar DELETE= command.

GabrieleV
sumber
Banyak membantu saya. Tapi saya harus menghapus "set ftp: list-options -a;" yang mana mengacaukan barang-barang.
mat
1
Apakah ada sesuatu seperti ini yang melakukan hal yang sama pada SFTP (FTPS?)?
trusktr
1
Saya akan melakukan ini sebelumnya cd $RCD, sehingga dapat mencegah-script-dengan-a-kesalahan ketik dari sengaja menghapus file dari direktori yang salah: set cmd:fail-exit yes. (Tampaknya lftptidak menyadari bahwa itu telah benar-benar keluar, sampai Anda mengeluarkan perintah selanjutnya.) - Dan sebelum cd $LCDaku melakukan ini (di shell lokal, yaitu, di bagian atas The Script): set -eu.
KajMagnus
3
Sebenarnya, pertama kali saya menjalankan skrip saya, saya belum membuat direktori jarak jauh, jadi skrip tersebut gagal memasukkan CD ke direktori yang tidak ada. Kemudian skrip mulai mirror, dan dengan demikian --delete: d file dari dir yang salah. (Tapi saya menyalinnya kembali, jadi dalam kasus itu tidak masalah. Mungkin itu penting untuk orang lain.)
KajMagnus
1
Selain mengikuti saran @KajMagnus tentang penggunaan 'set -eu' dan 'cd $ LCD', tambahkan 'mkdir -p $ LCD' sebelum 'cd $ LCD' - dengan cara itu Anda dapat memastikan bahwa direktori tersebut ada dan Anda ' kembali di dalamnya.
Paul Gear
25

Tergantung dari apa yang sebenarnya Anda coba lakukan, pendekatan lain yang sama sekali berbeda dapat digunakan curlftpsuntuk memasang folder ftp, dan kemudian mungkin rsyncdua folder "lokal".

Instalasi berbeda tergantung pada distro Anda jadi saya tidak bisa menyamaratakan itu, tetapi Anda perlu menginstal fusedan curlftpfs(prolly Debian sudah fusemenginstal secara default), kemudian:

  1. sudo apt-get install curlftpfs

  2. Pastikan fusemodul dimuat ( modprobe fuse)

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

Perhatikan bahwa tidak ada ruang setelah koma terakhir (ini bukan kesalahan ketik!). Jika Anda puas dengan itu atau tidak ingin melakukannya setiap saat, Anda dapat menambahkannya ke fstab Anda (biasanya dalam /etc/fstab):

curlftpfs#user:[email protected] /path/to/ftp/folder/ fuse auto,user,uid=1000,allow_other 0 0

Dalam hal ini, Anda harus memastikan modul sekering dimuat sebelumnya.

Namun, maklum dari dua hal:

  • Bahwa pengembang menghentikan proyek satu atau dua tahun yang lalu, jadi saya tidak tahu bagaimana dapat digunakan / stabil untuk saat ini.
  • Jika kata sandi berisi karakter aneh curlftpfsbisa gagal (mungkin Anda bisa melakukan sesuatu dengan itu .netrc).
Pablo Olmos de Aguilera C.
sumber
FTP Fuse dan rsync adalah yang paling dekat dengan pertanyaan tetapi jelas gila pada apa pun kecuali satu set kecil file kecil.
Steve-o
1
Mengapa itu menjadi gila? Secara default rsync stat () s, tidak membandingkan konten. Itu bisa dilakukan oleh ls-l dengan klien ftp.
ptman
Saya benar-benar mencoba ini (melalui rsnapshot) dan tidak berhasil, setiap file kembali dan kesalahan, menunjukkan bahwa rsync tidak dapat membuat tautan. Jadi menggunakan lftp dalam hubungannya dengan rsnapshot melakukan trik
Konstantin Pereiaslov
Sempurna pada 14,04 LTS; tip tambahan: ketika Anda siap untuk meng-unmount situs FTP Anda cukup gunakan di umount DIRmana DIRAnda di /path/to/ftp/folderatas.
Joe
1
2017, dan ini masih berfungsi! Jujur cara termudah untuk menyalin file dari enmasse situs FTP. Gunung secara lokal, kemudian rsync seolah-olah itu lokal
td512
16

Ada beberapa ...

Weex adalah utilitas yang dirancang untuk mengotomatiskan tugas menjaga jarak jauh halaman web atau arsip FTP lainnya. Ini akan menyinkronkan satu set file lokal ke server jauh dengan melakukan unggahan dan penghapusan jarak jauh seperti yang diperlukan.

Johan
sumber
2
Bekerja seperti pesona! Anda menjalankannya seperti ini: $ weex yourFTPconfigNameBerikut adalah manual linuxcertif.com/man/1/weex
sobi3ch
9

rsync tidak berfungsi lebih dari ftp. Di sisi yang jauh ia membutuhkan daemon rsync atau shell yang dapat dipanggilnya rsync. Ftp umumnya memungkinkan Anda untuk memanggil beberapa perintah dan rsync bukan salah satunya. Ada alat lain yang dimaksudkan untuk mengotomatisasi tugas ftp seperti "lftp".

Ian Kelling
sumber
7

Untuk apa yang tampaknya Anda coba lakukan, Anda juga bisa menggunakan wget.

wget -m ftp: // username: [email protected]


sumber
Itu hanya akan membuat cermin situs. Anda tidak dapat menggunakan ini untuk mengunggah modifikasi Anda.
David V.
5

Anda dapat menggunakan curlftpfs untuk me-mount ftp dan menggunakan rsync setelah http://linux.die.net/man/1/curlftpfs

shaftmx
sumber
Selamat datang di ServerFault! Ini mungkin awal yang baik, tetapi beberapa detail teknis lebih lanjut mengapa ini adalah pendekatan yang lebih baik, dan mungkin mock up tentang bagaimana melakukannya, mungkin masuk akal.
Scott Pack
4

Saya menggunakan GVFS / FTP. Saya memasang server FTP jarak jauh saya dengan gigolo. Karena mereka dilihat sebagai direktori lokal, hampir semua yang bekerja pada file lokal berfungsi. rsync dirancang untuk menghitung hash file dari jauh untuk membandingkan file tanpa mentransfernya, tetapi melakukan hal itu dengan file virtual mentransfer file. serentak dan freefilesync biasanya berfungsi dengan baik tetapi saya menemukan masalah ketika mereka ingin mengganti nama file yang Anda unggah, tidak ada masalah mengunduh. Ini bisa menjadi masalah dengan gvfs 1.6.1.

Papou
sumber
2

Saya tidak percaya Anda akan dapat melakukan ini, server yang Anda coba untuk Rsync hanya akan memiliki server FTP yang berjalan, tidak akan mengerti perintah yang dikirim oleh Rsync.

Jika alasan Anda ingin melakukan ini adalah bahwa Anda hanya memiliki akses ke port 21, tetapi Anda memiliki kontrol terhadap server, Anda dapat mengubah port Rsync mendengarkan, pada server, tetapi ini jelas hanya berguna jika Anda tidak ingin menggunakan FTP pada port itu.

Sam Cogan
sumber
2

Jika Anda ingin mengotomatiskan tugas kemudian menggunakan lftp karena Anda dapat membuat skrip karena beberapa orang telah memposting di atas, Anda dapat skrip semuanya dengan sangat mudah sesuai dengan keinginan Anda, jika Anda mencari solusi satu kali (yaitu Anda perlu mengunduh seluruh situs web via ftp / pindahkan ke server lain) gunakan ncftp, ini sederhana, instal jika belum diinstal:

apt-get install ncftp

atau

yum install ncftp

(distro berbasis non debian / red hat ..)

setelah terinstal, buka ncftp di terminal lalu ketik:

open -u ftpusername ftp.thedomain.com

Ini akan menanyakan kata sandi Anda, masukkan, dan kemudian:

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

Ini akan melakukan sisanya untuk Anda .. semoga berhasil

dekode sandi
sumber
0

Ada juga wput:

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

Nama pengguna dan kata sandi dibaca dari ~ / .netrc. Kalau tidak, jika Anda tidak terlalu peduli dengan keamanan, Anda dapat menyediakannya sebagai ftp: // username: [email protected] .

Ole Wolf
sumber
0

Saya membuat alat baris perintah sendiri untuk itu: ftpsync

Mengapa? Karena sederhana dan elegan, alat-alat lain membutuhkan banyak dependensi, kadang-kadang kompilasi, kadang-kadang tidak berfungsi (misalnya lftp pada MacOs High Sierra). Ftpsync ditulis dalam Python murni, tidak memerlukan lib pihak ke-3 dan ini kecil, Anda hanya bisa memasukkan file dalam proyek Anda.

Penggunaan: cd ke direktori proyek Anda dan ketik:

ftpsync user:[email protected]/remote/dir --delete

--delete singkatan menghapus file jarak jauh yang tidak ada secara lokal.

Jika Anda tidak ingin melakukan sinkronisasi tetapi jalankan perintah raw ftp gunakan:

ftpsync -c '...'

Ini berguna untuk beberapa operasi sederhana seperti mengirim file dan menamainya kembali:

ftpsync -c 'PASV; TYPE I; STOR some_file.ext; RNFR some_file.ext; RNTO some_file_renamed.ext'
superdario128
sumber
Stumbled atas ini karena alasan yang sama seperti orang lain. Kebutuhan akan utilitas sinkronisasi yang baik melalui protokol FTP. Alat Anda terlihat bagus, tetapi saya tidak dapat menggunakannya, karena persyaratan saya adalah mengunduh dari jarak jauh dan menyinkronkan dengan lokal. Saya ingin menghindari mengunduh file yang sudah diunduh. Di lokal saya melakukan pemrosesan pada file yang diunduh yang membuatnya berbeda; yang harus dilewati saat skrip FTP berjalan. Saat ini sulit menemukan solusi.
anup
Ya, sebenarnya ini sinkronisasi satu arah.
superdario128
0

rclone adalah perangkat lunak yang bagus yang melakukan sinkronisasi direktori melalui ftp dan banyak protokol lainnya termasuk penyedia penyimpanan cloud (Amazon S3, Dropbox, Google Drive). Itu dapat menyinkronkan ke / dari kombinasi penyimpanan lokal atau jarak jauh.

Untuk mengatur ftpremote, ikuti instruksi ini .

Setelah selesai, operasi sinkronisasi adalah:

rclone sync /home/dir FTP_REMOTE:/home --progress 
bernie
sumber
-7

Instal sftp dan kemudian Anda dapat menggunakan rsync.

Saya menggunakan yang berikut ini.

rsync --delete --times --recursive --perms --owner --group --verbose --progress --stats -e ssh [email protected]:/folder1/ /folder2/
Rajat
sumber
7
Yang tidak FTP mungkin menggunakan sftp subsistem internal untuk SSH (setidaknya itulah apa yang dilakukannya di config default)
serverhorror
csync (sftp) dan rsync mungkin cara yang sama untuk bekerja
Rajat