วิธีใช้ rsync ผ่าน FTP


187

ยูนิกซ์ใด ๆ :

ฉันมีบรรทัด cmd ต่อไปนี้ซึ่งทำงานได้ดี

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

แต่ฉันต้องตั้งค่าตอนนี้เพื่อ rsync กับเซิร์ฟเวอร์ระยะไกลที่มีเซิร์ฟเวอร์ FTP อยู่เท่านั้น ฉันจะทำอย่างไรเกี่ยวกับเรื่องนั้น?

ฉันดูความช่วยเหลือ rsync แต่หายไปอย่างรวดเร็ว (ฉันไม่ได้ทำสิ่งนี้บ่อยมาก)


21
นี้จะคล้ายกับการถามถึงวิธีการใช้ HTTP ผ่าน IRC หรือวิธีการใช้ FTP ผ่าน SMTP ...
Juliano

2
บางทีคุณอาจอธิบายเหตุผลบางอย่างของคุณเกี่ยวกับความต้องการที่จะทำสิ่งนี้จากนั้นเราสามารถช่วยคุณหาวิธีแก้ปัญหาที่ทำงานได้
James

1
โดยพื้นฐานแล้วฉันกำลังพยายามทำการสำรองข้อมูลโดยอัตโนมัติจากเซิร์ฟเวอร์การโฮสต์ที่ใช้ร่วมกันและไม่เข้าใจวิธีการทำงานของ rsync ฉันได้ย้ายไปเป็น vps แล้วและไม่มีข้อ จำกัด ของ ftp อีกต่อไป
bumperbox

Duplicity คือพระเจ้าของคุณ: scie.nti.st/2013/4/13/...
user956584

หากการใช้งานคือสิ่งที่อยู่ในใจของคุณและคุณไม่รังเกียจ NodeJS ตรวจสอบdploy , ขี้เกียจและทำงานได้ดีกับคอมไพล์
Frank Nocke

คำตอบ:


78

คุณทำไม่ได้ rsync ไม่สามารถทำได้สำหรับคุณมันเป็นโปรโตคอลของตัวเองและไม่ทำงานผ่าน FTP

คุณอาจ แต่ต้องการที่จะลองcsync IIRC จัดให้มีพฤติกรรมคล้าย rsync ผ่าน HTTP ฉันไม่สามารถแสดงความคิดเห็นว่าทำงานได้กับ FTP หรือไม่คุณจะต้องลอง


1
ดูที่หน้าเว็บ csyncรองรับ sftp แต่ไม่ต้องพูดถึงการสนับสนุน ftp ธรรมดา
Keith Thompson

162

rsyncจะไม่ทำงานสำหรับคุณด้วยเหตุผลที่คนอื่นพูดถึง อย่างไรก็ตามทั้งสองlftpและncftpมีโหมด "mirror" ที่อาจตอบสนองความต้องการของคุณ

ฉันใช้สิ่งนี้เพื่อผลักดันเนื้อหาจากไดเรกทอรีในพื้นที่ของฉันไปยังเว็บโฮสต์ ftp หรือ 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 เป็นคนดีมาก อีกอันหนึ่งที่ฉันเพิ่งค้นพบคือwputมีการ จำกัด แบนด์วิดท์ในตัว
karmakaze

122

เขียนโดยขาตั้ง , lftpเป็นเครื่องมือที่ดี

ฉันแนะนำให้คุณเขียนบทละครและใช้ประโยชน์จาก

exclude-glob

ตัวเลือกที่ไม่รวมชื่อไฟล์โดยใช้คุณสมบัติ glob (* ,? .. ) ของเชลล์ของคุณ:

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

คำเตือน:ตรวจสอบให้แน่ใจว่ามีไดเรกทอรีเป้าหมายอยู่มิฉะนั้นคำสั่ง cd จะล้มเหลวดังนั้นการดำเนินการรวมถึงการลบแผนผังไฟล์ จะเกิดขึ้นที่ไดเรกทอรีผิด (รูท)!

ฉันมีการปรับปรุงสคริปต์เพื่อให้--deleteตัวเลือกที่ถูกปิดใช้งานโดย defaut ให้เปิดใช้งานได้โดย uncommentingDELETE= command


ช่วยให้ฉันเป็นพวงที่ดี แต่ฉันต้องลบ "set ftp: list-options -a;" ซึ่งสิ่งที่ messing up
เสื่อ

1
มีอะไรแบบนี้ที่ทำสิ่งเดียวกันกับ SFTP (FTPS?)
trusktr

1
ฉันจะทำแบบนี้มาก่อนcd $RCDเพื่อที่จะป้องกันไม่ให้สคริปต์กับ-a-typo set cmd:fail-exit yesเผลอลบไฟล์จากไดเรกทอรีที่ไม่ถูกต้อง: (ดูเหมือนlftpไม่ได้แจ้งให้ทราบว่าได้ออกจริงจนกว่าคุณจะออกคำสั่งต่อไป.) - และก่อนที่cd $LCDผมจะทำเช่นนี้ set -eu(ในเปลือกท้องถิ่นที่เป็นที่ด้านบนของใบที่):
KajMagnus

3
ที่จริงแล้วเป็นครั้งแรกที่ฉันเรียกใช้สคริปต์ของฉันฉันยังไม่ได้สร้างไดเรกทอรีระยะไกลดังนั้นสคริปต์จึงไม่สามารถซีดีลงใน dir ที่ไม่มีอยู่ได้ จากนั้นสคริปต์ก็เริ่มmirrorและดังนั้น--delete: d ไฟล์จาก dir ผิด (แต่ฉันคัดลอกพวกเขากลับมาอีกครั้งดังนั้นในกรณีนี้มันไม่สำคัญบางทีมันก็สำคัญสำหรับคนอื่น)
KajMagnus

1
เช่นเดียวกับการปฏิบัติตาม @KajMagnus 'คำแนะนำเกี่ยวกับการใช้' set -eu 'และ' cd $ LCD 'ให้เพิ่ม' mkdir -p $ LCD 'ก่อน' cd $ LCD '- วิธีที่คุณมั่นใจได้ว่าไดเรกทอรีนั้นมีอยู่และคุณ' อีกครั้งในนั้น
Paul Gear

25

ขึ้นอยู่กับสิ่งที่คุณพยายามจะทำจริงอีกวิธีที่แตกต่างกันโดยสิ้นเชิงอาจใช้curlftpsเพื่อเมานต์โฟลเดอร์ ftp และอาจrsyncเป็นโฟลเดอร์ "local" สองโฟลเดอร์

การติดตั้งจะแตกต่างกันไปขึ้นอยู่กับ distro ของคุณดังนั้นฉันไม่สามารถพูดคุยกับมันได้ แต่คุณต้องติดตั้งfuseและcurlftpfs(Debian prolly มีการfuseติดตั้งตามค่าเริ่มต้น):

  1. sudo apt-get install curlftpfs

  2. ตรวจสอบให้แน่ใจว่าfuseโหลดโมดูลแล้ว ( modprobe fuse)

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

โปรดทราบว่าไม่มีช่องว่างหลังเครื่องหมายจุลภาคสุดท้าย (ไม่ใช่แบบพิมพ์ผิด!) หากคุณพอใจกับสิ่งนั้นหรือไม่ต้องการทำสิ่งนั้นทุกครั้งคุณสามารถเพิ่มลงใน fstab ของคุณ (โดยปกติคือ/etc/fstab):

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

ในกรณีนี้คุณต้องแน่ใจว่าได้โหลดโมดูลฟิวส์มาก่อน

โปรดทราบว่ามีสองสิ่ง:

  • ว่าผู้พัฒนาได้ทำโปรเจ็กต์หนึ่งหรือสองปีที่แล้วดังนั้นฉันจึงไม่รู้ว่าการใช้งาน / เสถียรในขณะนี้เป็นอย่างไร
  • หากรหัสผ่านมีอักขระแปลก ๆcurlftpfsอาจล้มเหลว (บางทีคุณสามารถทำอะไรกับ.netrc)

FTP Fuse และ rsync นั้นใกล้เคียงกับคำถามมากที่สุด แต่มันก็บ้าอย่างชัดเจนในทุกเรื่องยกเว้นไฟล์เล็ก ๆ ชุดหนึ่ง
Steve-o

1
ทำไมมันถึงบ้า? โดยค่าเริ่มต้น rsync stat () s มันไม่ได้เปรียบเทียบเนื้อหา ที่สามารถทำได้โดย ls -l ด้วยไคลเอนต์ ftp
ptman

ฉันลองใช้วิธีนี้ (ผ่าน rsnapshot) และมันใช้งานไม่ได้แต่ละไฟล์คืนและเกิดข้อผิดพลาดแสดงว่า rsync ไม่สามารถสร้างลิงก์ได้ ดังนั้นการใช้ lftp ร่วมกับ rsnapshot จึงใช้กลอุบาย
Konstantin Pereiaslov

ไม่มีที่ติบน 14.04 LTS; เคล็ดลับเพิ่มเติม: เมื่อคุณพร้อมที่จะยกเลิกการต่อเชื่อมไซต์ FTP ของคุณเพียงแค่ใช้umount DIRตำแหน่งที่DIRคุณ/path/to/ftp/folderอยู่ด้านบน
โจ

1
2017 และนี่ยังใช้งานได้! สุจริตเป็นวิธีที่ง่ายที่สุดในการคัดลอกไฟล์จาก enmasse ไซต์ FTP เมานต์ในท้องถิ่นจากนั้น rsync ราวกับว่าเป็นในท้องถิ่น
td512

16

มีweex ...

Weex เป็นยูทิลิตี้ที่ออกแบบมาเพื่อทำงานของการบำรุงรักษาเว็บเพจหรือ FTP เก็บถาวรอื่นจากระยะไกลโดยอัตโนมัติ มันจะซิงโครไนซ์ชุดไฟล์โลคัลกับรีโมตเซิร์ฟเวอร์โดยทำการอัพโหลดและลบรีโมตตามต้องการ


2
ทำงานเหมือนจับใจ! คุณใช้งานแบบนี้: $ weex yourFTPconfigNameนี่คือคู่มือlinuxcertif.com/man/1/weex
sobi3ch

9

rsync ไม่ทำงานบน ftp ในด้านระยะไกลนั้นต้องการ rsync daemon หรือเชลล์ที่สามารถเรียก rsync ได้ โดยทั่วไปแล้ว Ftp จะช่วยให้คุณสามารถเรียกคำสั่งบางคำสั่งได้และ rsync ไม่ใช่คำสั่งใดคำสั่งหนึ่ง มีเครื่องมืออื่น ๆ สำหรับการทำ ftp อย่างอัตโนมัติเช่น "lftp"


8

ดูเหมือนว่าจะพอดีและดี: https://savannah.gnu.org/projects/ftpsync/


1
ป.ร. ให้ไว้ ณ กองนึ่งของห้ามสัมผัสกับ-a-สิบเท้าขั้ว SourceForge ได้กลายเป็นเมื่อเร็ว ๆ นี้บางทีคุณควรปรับปรุงการเชื่อมโยงไปที่หน้าเว็บของโครงการ
HopelessN00b

7

สำหรับสิ่งที่ดูเหมือนว่าคุณกำลังพยายามทำอยู่คุณสามารถใช้ wget ได้เช่นกัน

wget -m ftp: // ชื่อผู้ใช้: password@domain.com


ที่จะทำให้กระจกของเว็บไซต์ คุณไม่สามารถใช้สิ่งนี้เพื่ออัปโหลดการแก้ไขของคุณ
David V.

5

คุณสามารถใช้ curlftpfs เพื่อเมานต์ ftp และใช้ rsync หลังจาก http://linux.die.net/man/1/curlftpfs


ยินดีต้อนรับสู่ ServerFault! นี่อาจเป็นการเริ่มต้นที่ดี แต่รายละเอียดทางเทคนิคบางอย่างเพิ่มเติมว่าทำไมนี่เป็นวิธีการที่ดีกว่าและอาจเป็นการจำลองว่าจะทำอย่างไรอาจมีเหตุผล
Scott Pack

4

ฉันใช้ GVFS / FTP ฉันติดตั้งเซิร์ฟเวอร์ FTP ระยะไกลของฉันด้วย Gigolo ตามที่พวกเขาเห็นว่าเป็นไดเรกทอรีท้องถิ่นเกือบทุกอย่างที่ทำงานกับไฟล์ท้องถิ่นทำงาน rsync ได้รับการออกแบบมาเพื่อคำนวณไฟล์แฮชจากระยะไกลเพื่อเปรียบเทียบไฟล์โดยไม่ต้องโอนไฟล์ แต่การทำเช่นนั้นกับไฟล์เสมือนจะถ่ายโอนไฟล์ต่อไป พร้อมเพรียงและ freefilesync ทำงานได้ตามปกติ แต่ฉันพบปัญหาเมื่อพวกเขาต้องการเปลี่ยนชื่อไฟล์ที่คุณอัปโหลดไม่มีปัญหาในการดาวน์โหลด นี่อาจเป็นปัญหากับ gvfs 1.6.1


3

โซลูชันของ Jonas S อาจมีประโยชน์ขึ้นอยู่กับสถานการณ์เช่นถ้าคุณมีความเร็วในการดาวน์โหลดสูงและอัปโหลดช้าการตรวจสอบไฟล์บนเซิร์ฟเวอร์อาจค่อนข้างเร็วกว่าการอัปโหลดไฟล์โดยไม่จำเป็น

คุณอาจต้องการใช้ CurlFTPFS แต่: http://packages.ubuntu.com/search?suite=default§ion=all&arch=any&searchon=names&keywords=curlftpfs

แม้ว่าโดยทั่วไปจะเป็นการดีกว่าถ้าใช้ FTP ไคลเอนต์ปกติพร้อมกันแทนที่จะเป็น rsync


2

ฉันไม่เชื่อว่าคุณจะสามารถทำได้เซิร์ฟเวอร์ที่คุณพยายาม Rsync จะมีเซิร์ฟเวอร์ FTP ที่ทำงานเท่านั้นจะไม่เข้าใจคำสั่งที่ Rsync ส่ง

หากเหตุผลที่คุณต้องการทำเช่นนี้คือคุณมีสิทธิ์เข้าถึงพอร์ต 21 เท่านั้น แต่คุณสามารถควบคุมเซิร์ฟเวอร์ได้คุณสามารถเปลี่ยนพอร์ต Rsync รอฟังบนเซิร์ฟเวอร์ แต่เห็นได้ชัดว่ามีประโยชน์เฉพาะในกรณีที่คุณไม่มี ต้องการใช้ FTP บนพอร์ตนั้น


2

หากคุณต้องการทำให้งานเป็นแบบอัตโนมัติจากนั้นใช้ lftp ในขณะที่คุณสามารถสร้างสคริปต์ในขณะที่บางคนโพสต์ไว้ด้านบนคุณสามารถเขียนสคริปต์ได้อย่างง่ายดายตามที่คุณต้องการหากคุณกำลังมองหาวิธีแก้ปัญหาเพียงครั้งเดียว ผ่าน ftp / ย้ายไปยังเซิร์ฟเวอร์อื่น) ใช้ ncftp ง่าย ๆ ติดตั้งถ้ายังไม่ได้ติดตั้ง:

apt-get install ncftp

หรือ

yum install ncftp

(ขออภัย distros ที่ไม่ใช่เดเบียน / หมวกสีแดง .. )

เมื่อติดตั้งแล้วให้เปิด ncftp ในเทอร์มินัลแล้วพิมพ์:

open -u ftpusername ftp.thedomain.com

มันจะขอรหัสผ่านป้อนจากนั้น:

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

มันจะทำหน้าที่ส่วนที่เหลือให้คุณ .. โชคดี



0

นอกจากนี้ยังมี wput:

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

ชื่อผู้ใช้และรหัสผ่านอ่านจาก ~ / .netrc มิฉะนั้นถ้าคุณไม่ได้โดยเฉพาะที่เกี่ยวข้องกับการรักษาความปลอดภัยคุณอาจจัดหาพวกเขาเป็นftp: // ชื่อผู้ใช้: password@target.host


0

ฉันสร้างเครื่องมือบรรทัดคำสั่งของตัวเองสำหรับ: ftpsync

ทำไม? เนื่องจากเป็นเครื่องมือที่เรียบง่ายและสง่างามเครื่องมืออื่น ๆ จึงต้องมีการพึ่งพามากบางครั้งการรวบรวมบางครั้งก็ใช้ไม่ได้ (เช่น lftp บน MacOs High Sierra) Ftpsync เขียนด้วย Python บริสุทธิ์ไม่จำเป็นต้องใช้ libs ของบุคคลที่สามและมีขนาดเล็กคุณสามารถรวมไฟล์ไว้ในโครงการของคุณได้

การใช้งาน: cd ไปยังไดเรกทอรีโครงการของคุณและประเภท:

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

--delete ย่อมาจากการลบไฟล์ระยะไกลซึ่งไม่มีอยู่ในเครื่อง

หากคุณไม่ต้องการซิงค์ แต่เพียงใช้คำสั่ง raw ftp ให้ใช้:

ftpsync -c '...'

มีประโยชน์สำหรับการดำเนินการอย่างง่ายเช่นการส่งไฟล์และเปลี่ยนชื่อ:

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

สะดุดกับสิ่งนี้เนื่องจากเหตุผลเดียวกับที่คนอื่นทำ จำเป็นสำหรับยูทิลิตี้การซิงค์ที่ดีผ่านโปรโตคอล FTP เครื่องมือของคุณดูดี แต่ฉันไม่สามารถใช้งานได้เนื่องจากความต้องการของฉันคือการดาวน์โหลดจากระยะไกลและซิงค์กับท้องถิ่น ฉันต้องการหลีกเลี่ยงการดาวน์โหลดไฟล์ที่ดาวน์โหลดมาแล้ว ในพื้นที่ฉันทำการประมวลผลไฟล์ที่ดาวน์โหลดซึ่งทำให้แตกต่าง ที่ควรข้ามในครั้งถัดไปที่รันสคริปต์ FTP ในช่วงเวลาที่ยากลำบากในการหาทางออก
anup

ใช่จริงๆแล้วมันเป็นการซิงค์ทางเดียว
superdario128

0

rcloneเป็นซอฟต์แวร์ที่ใช้ในการซิงโครไนซ์ไดเรกทอรีผ่าน ftp และโปรโตคอลอื่น ๆ อีกมากมายรวมถึงผู้ให้บริการที่เก็บข้อมูลบนคลาวด์ (Amazon S3, Dropbox, Google Drive) มันสามารถประสานกับ / จากการรวมกันของการจัดเก็บในท้องถิ่นหรือระยะไกล

การติดตั้งftpระยะไกลทำตามคำแนะนำเหล่านี้

เมื่อเสร็จสิ้นการดำเนินการซิงค์จะเป็น:

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

-7

ติดตั้งsftpแล้วคุณสามารถใช้ rsync

ฉันใช้สิ่งต่อไปนี้

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

7
นั่นคือไม่ได้ FTP มันอาจจะใช้ระบบย่อย SFTP ภายในเพื่อ SSH (อย่างน้อยนั่นคือสิ่งที่มันไม่ในการตั้งค่าเริ่มต้น)
serverhorror

csync (SFTP) และ rsync อาจจะเป็นวิธีเดียวของการทำงาน
Rajat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.