Cách sử dụng rsync qua FTP


187

Bất kỳ unix:

Tôi có dòng cmd sau hoạt động tốt.

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

Nhưng tôi cần thiết lập nó ngay bây giờ để rsync đến một máy chủ từ xa chỉ có máy chủ FTP trên đó. Làm thế nào để tôi đi về điều đó?

Tôi đã xem trợ giúp rsync nhưng nhanh chóng bị lạc (tôi không thường xuyên làm việc này).


21
Điều này giống như hỏi cách sử dụng HTTP qua IRC hoặc cách sử dụng FTP qua SMTP ...
Juliano

2
Có lẽ bạn có thể giải thích một số lý do của bạn để muốn làm điều này, sau đó chúng tôi có thể giúp bạn đưa ra một giải pháp khả thi.
James

1
về cơ bản, tôi đã cố gắng tự động hóa một bản sao lưu từ một máy chủ lưu trữ được chia sẻ và không hiểu rsync hoạt động như thế nào. Tôi đã chuyển sang một vps bây giờ và không còn giới hạn của ftp nữa
bội thu

Bản sao là thần của bạn: scie.nti.st/2013/4/13/ từ
user956584

Nếu triển khai là, những gì trong tâm trí của bạn và bạn không bận tâm đến NodeJS, hãy kiểm tra dploy , lười biếng và làm việc tốt với git
Frank Nocke

Câu trả lời:


78

Bạn không. rsync không thể làm điều đó cho bạn, nó là một giao thức của riêng nó và không hoạt động trên FTP.

Tuy nhiên, bạn có thể muốn thử csync . IIRC nó cung cấp hành vi giống như rsync trên HTTP. Tôi không thể nhận xét về việc nó có hoạt động trên FTP hay không, bạn sẽ phải thử nó.


1
Nhìn vào trang web csync , nó hỗ trợ sftp nhưng không đề cập đến hỗ trợ cho ftp đơn giản.
Keith Thompson

162

rsync sẽ không làm việc cho bạn vì những lý do mà người khác đã đề cập. Tuy nhiên, lftpncftp đều có chế độ "gương" có thể sẽ đáp ứng nhu cầu của bạn.

Tôi sử dụng điều này để đẩy công cụ từ thư mục địa phương của tôi đến máy chủ web ftp hoặc 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 là rất tốt đẹp. một cái khác tôi vừa tìm ra là wputcó giới hạn băng thông tích hợp.
karmakaze

122

Như được viết bởi giá vẽ , lftplà một công cụ tốt.

Tôi đề nghị bạn nên tham số hóa tập lệnh và sử dụng

exclude-glob

tùy chọn, loại trừ tên tệp bằng tính năng toàn cầu (*,? ..) của trình bao của bạn:

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

Cảnh báo: đảm bảo rằng thư mục đích tồn tại, nếu không lệnh cd sẽ thất bại, vì vậy thao tác bao gồm xóa cây của các tệp sẽ diễn ra tại thư mục sai (root)!

Tôi đã cập nhật tập lệnh để --deletetùy chọn đó bị vô hiệu hóa bởi defaut, kích hoạt nó bằng cách bỏ ghi chú DELETE= command.


Đã giúp tôi một bó lớn. Nhưng tôi đã phải xóa "set ftp: list-Options -a;" nơi mà những thứ lộn xộn lên.
chiếu

1
Có một cái gì đó như thế này làm điều tương tự trên SFTP (FTPS?)?
trusktr

1
Tôi sẽ làm điều này trước đây cd $RCD, để ngăn a-script-with-a-typo vô tình xóa các tệp khỏi thư mục sai : set cmd:fail-exit yes. (Dường như lftpkhông nhận thấy rằng nó thực sự đã thoát, cho đến khi bạn đưa ra lệnh tiếp theo.) - Và trước khi cd $LCDtôi thực hiện điều này (trong trình bao cục bộ, nghĩa là, ở đầu đoạn mã) : set -eu.
KajMagnus

3
Trên thực tế, lần đầu tiên tôi chạy tập lệnh của mình, tôi chưa tạo thư mục từ xa, vì vậy tập lệnh thất bại trong CD vào thư mục không tồn tại đó. Sau đó, tập lệnh bắt đầu mirrorvà do đó --delete: d tập tin từ thư mục sai. (Nhưng tôi đã sao chép chúng một lần nữa, vì vậy trong trường hợp đó không thành vấn đề. Có lẽ nó quan trọng với người khác.)
KajMagnus

1
Cũng như làm theo lời khuyên của @KajMagnus về cách sử dụng 'set -eu' và 'cd $ LCD', hãy thêm 'mkdir -p $ LCD' trước 'cd $ LCD' - theo cách đó bạn có thể chắc chắn rằng thư mục tồn tại và bạn ' lại trong đó.
Paul Gear

25

Tùy thuộc vào những gì bạn thực sự đang cố gắng thực hiện, một cách tiếp cận hoàn toàn khác có thể được sử dụng curlftpsđể gắn một thư mục ftp, và sau đó có thể rsynclà hai thư mục "cục bộ".

Cài đặt khác nhau tùy thuộc vào bản phân phối của bạn, vì vậy tôi không thể khái quát về điều đó, nhưng bạn cần cài đặt fusecurlftpfs(prolly Debian đã fusecài đặt theo mặc định), sau đó:

  1. sudo apt-get install curlftpfs

  2. Đảm bảo fusemô-đun được tải ( modprobe fuse)

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

Lưu ý rằng không có khoảng trắng sau dấu phẩy cuối cùng (đó không phải là lỗi chính tả!). Nếu bạn hài lòng với điều đó hoặc không muốn thực hiện điều đó mỗi lần, bạn có thể thêm nó vào fstab của mình (thường là trong /etc/fstab):

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

Trong trường hợp đó, bạn phải đảm bảo mô-đun cầu chì được tải trước đó.

Mặc dù vậy, hãy lưu ý hai điều sau:

  • Rằng nhà phát triển đã bỏ dự án một hoặc hai năm trước, vì vậy tôi không biết làm thế nào có thể sử dụng / ổn định trong thời điểm hiện tại.
  • Nếu mật khẩu chứa một ký tự lạ curlftpfscó thể thất bại (có thể bạn có thể làm gì đó với .netrc).

FTP Fuse và rsync gần nhất với câu hỏi nhưng rõ ràng điên rồ về bất cứ điều gì ngoại trừ một tập hợp nhỏ các tệp nhỏ.
Steve-o

1
Tại sao nó sẽ điên rồ? Theo mặc định rsync stat () s, nó không so sánh nội dung. Điều đó có thể được thực hiện bởi ls -l với một khách hàng ftp.
ptman

Tôi thực sự đã thử điều này (thông qua rsnapshot) và nó không hoạt động, mỗi tệp bị trả về và lỗi, cho thấy rsync không thể tạo liên kết. Vì vậy, sử dụng lftp kết hợp với rsnapshot đã thực hiện thủ thuật
Konstantin Pereiaslov

Hoàn hảo vào ngày 14.04 LTS; một mẹo bổ sung: khi bạn sẵn sàng ngắt kết nối trang FTP của bạn, chỉ cần sử dụng umount DIRvị trí DIRcủa bạn /path/to/ftp/folderở trên.
Joe

1
2017, và điều này vẫn hoạt động! Thành thật là cách dễ nhất để sao chép các tập tin từ một trang web FTP. Gắn kết cục bộ, sau đó rsync như thể nó là cục bộ
td512

16

tuần trăng mật ...

Weex là một tiện ích được thiết kế để tự động hóa nhiệm vụ duy trì từ xa một trang web hoặc kho lưu trữ FTP khác. Nó sẽ đồng bộ hóa một tập hợp các tệp cục bộ đến một máy chủ từ xa bằng cách thực hiện tải lên và xóa từ xa theo yêu cầu.


2
Hoạt động như quyến rũ! Bạn chạy nó như thế này: $ weex yourFTPconfigNameDưới đây là hướng dẫn sử dụng linuxcertif.com/man/1/weex
sobi3ch

9

rsync không hoạt động trên ftp. Ở phía xa, nó cần daemon rsync hoặc shell mà nó có thể gọi rsync từ đó. Ftp thường cho phép bạn gọi một vài lệnh và rsync không phải là một trong số chúng. Có các công cụ khác có nghĩa là để tự động hóa các tác vụ ftp như "lftp".



7

Đối với những gì nó xuất hiện bạn đang cố gắng làm, bạn cũng có thể sử dụng wget.

wget -m ftp: // tên người dùng: password@domain.com


Điều đó sẽ chỉ làm một tấm gương của trang web. Bạn không thể sử dụng điều này để tải lên các sửa đổi của bạn.
David V.

5

Bạn có thể sử dụng curlftpfs để gắn kết ftp và sử dụng rsync sau http://linux.die.net/man/1/curlftpfs


Chào mừng bạn đến với ServerFault! Đây có thể là một khởi đầu tốt, nhưng một số chi tiết kỹ thuật hơn về lý do tại sao đây là một cách tiếp cận tốt hơn, và có thể là một mô phỏng về cách làm nó, có thể là hợp lý.
Scott Pack

4

Tôi đang sử dụng GVFS / FTP. Tôi gắn máy chủ FTP từ xa của tôi với gigolo. Vì chúng được xem như các thư mục cục bộ, hầu hết mọi thứ hoạt động trên các tệp cục bộ đều hoạt động. rsync được thiết kế để tính toán băm tệp từ xa để so sánh các tệp mà không chuyển chúng, nhưng thực hiện điều đó với các tệp ảo sẽ chuyển các tệp bằng mọi cách. unison và freefilesync thường hoạt động tốt nhưng tôi gặp một vấn đề khi họ muốn đổi tên một tệp bạn đã tải lên, không có vấn đề gì khi tải xuống. Đây có thể là một vấn đề với gvfs 1.6.1.


3

Giải pháp của Jonas S có thể hữu ích tùy thuộc vào hoàn cảnh, ví dụ nếu bạn có tốc độ tải xuống cao và tải lên chậm, kiểm tra các tệp trên máy chủ có thể tương đối nhanh hơn tải lên các tệp không cần thiết.

Bạn có thể muốn sử dụng CurlFTPFS, mặc dù: http://packages.ubfox.com/search?suite=default§ion=all&arch=any&searchon=names&keywords=curlftpfs

Mặc dù, nhìn chung, tốt hơn hết là sử dụng máy khách FTP thông thường thay vì rsync.


2

Tôi không tin rằng bạn sẽ có thể làm điều này, máy chủ mà bạn đang cố gắng để Syncync sẽ chỉ có một máy chủ FTP đang chạy, nó sẽ không hiểu các lệnh mà Rupync đang gửi nó.

Nếu lý do bạn muốn làm điều này là vì bạn chỉ có quyền truy cập vào cổng 21, nhưng bạn có quyền kiểm soát máy chủ, bạn có thể thay đổi cổng mà Rsync lắng nghe trên máy chủ, nhưng điều này rõ ràng chỉ hữu ích nếu bạn không muốn sử dụng FTP trên cổng đó.


2

Nếu bạn muốn tự động hóa tác vụ thì hãy sử dụng lftp vì bạn có thể tạo tập lệnh như một số người đã đăng ở trên, bạn có thể tạo tập lệnh thực sự dễ dàng theo ý thích của mình, nếu bạn đang tìm giải pháp một lần (nghĩa là bạn cần tải xuống toàn bộ trang web thông qua ftp / di chuyển nó đến một máy chủ khác) sử dụng ncftp, đơn giản, cài đặt nó nếu nó chưa được cài đặt:

apt-get install ncftp

hoặc là

yum install ncftp

(xin lỗi các bản phân phối không dựa trên mũ / mũ đỏ ..)

Sau khi cài đặt, mở ncftp trong terminal rồi gõ:

open -u ftpusername ftp.thedomain.com

Nó sẽ hỏi bạn mật khẩu, nhập mật khẩu và sau đó:

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

Nó sẽ làm phần còn lại trong công việc cho bạn .. chúc may mắn



0

Ngoài ra còn có tranh luận:

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

Tên người dùng và mật khẩu được đọc từ ~ / .netrc. Mặt khác, nếu bạn không đặc biệt quan tâm đến bảo mật, bạn có thể cung cấp chúng dưới dạng ftp: // username: password@target.host .


0

Tôi đã tạo công cụ dòng lệnh riêng cho việc đó: ftpsync

Tại sao? Vì đơn giản và thanh lịch, các công cụ khác đòi hỏi rất nhiều phụ thuộc, đôi khi biên dịch, đôi khi không hoạt động (ví dụ: lftp trên MacOs High Sierra). Ftpsync được viết bằng Python thuần túy, không yêu cầu lib của bên thứ 3 và nó nhỏ, bạn chỉ có thể đưa tệp vào dự án của mình.

Sử dụng: cd vào thư mục dự án của bạn và gõ:

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

--delete là viết tắt của việc xóa các tập tin từ xa không tồn tại cục bộ.

Nếu bạn không muốn đồng bộ hóa mà chỉ chạy lệnh ftp thô, hãy sử dụng:

ftpsync -c '...'

Nó hữu ích cho một số thao tác đơn giản như gửi tệp và đổi tên nó:

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

Tình cờ gặp phải điều này vì lý do tương tự như những người khác. Cần một tiện ích đồng bộ tốt qua giao thức FTP. Công cụ của bạn có vẻ tốt, nhưng tôi không thể đưa nó vào sử dụng, vì yêu cầu của tôi là tải xuống từ xa và đồng bộ hóa với cục bộ. Tôi muốn tránh tải xuống các tập tin đã được tải xuống. Trên địa phương tôi thực hiện xử lý các tệp đã tải xuống làm cho nó khác nhau; nên bỏ qua lần tới khi tập lệnh FTP chạy. Hiện tại khó khăn trong việc tìm kiếm một giải pháp.
anup

Vâng, thực sự đó là đồng bộ một chiều.
superdario128

0

rclone là một phần mềm đẹp giúp đồng bộ hóa thư mục qua ftp và nhiều giao thức khác bao gồm các nhà cung cấp lưu trữ đám mây (Amazon S3, Dropbox, Google Drive). Nó có thể đồng bộ hóa đến / từ bất kỳ sự kết hợp nào của bộ nhớ cục bộ hoặc từ xa.

Để thiết lập một ftpđiều khiển từ xa làm theo các hướng dẫn sau .

Khi đã xong, thao tác đồng bộ hóa là:

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

-7

Cài đặt sftp và sau đó bạn có thể sử dụng rsync.

Tôi sử dụng một trong những sau đây.

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

7
Đó không phải là FTP, có lẽ nó sử dụng hệ thống con sftp bên trong để SSH (ít nhất đó là những gì nó làm trong cấu hình mặc định)
serverh khiếp

csync (sftp) và rsync có thể giống như cách làm việc
Rajat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.