ซอฟต์แวร์เพื่อซิงโครไนซ์สองไดเรกทอรี (local / remote)


9

ฉันต้องการซอฟต์แวร์ที่จะตรวจจับการเปลี่ยนแปลงในไดเรกทอรี (A) ทุกๆ 5 วินาทีหรือมากกว่านั้นและอัปโหลด / ลบไฟล์ที่ถูกเปลี่ยนจากไดเรกทอรีระยะไกล / ที่ (B)

ผมพบว่าซอฟต์แวร์ที่ไม่ใช่เชิงพาณิชย์https://github.com/devstructure/doubledown ฉันสงสัยว่ามีทางเลือกทางการค้าหรือไม่?

คำตอบ:


12

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

สมมติว่าคุณมีแหล่งที่มาของเครื่องที่เป็นโฮสต์รุ่นทรีของไดเรกทอรี/my/treeและอ่างล้างมือเครื่องที่คุณต้องการเก็บไว้ในการซิงโครไนซ์อย่างใกล้ชิด หากคุณมีบัญชี SSH ในอ่างล้างจานที่คุณสามารถจากแหล่งที่มาใช้ rsync ดังนี้

rsync -avz --delete -e ssh /my/tree/ remoteuser@sink:/my/tree

นี้จะถือว่าคุณต้องการ/my/treeในจุดเดียวกันแน่นอนในอ่างล้างจานในขณะที่คุณมีไว้ในแหล่งที่มา แน่นอนคุณไม่จำเป็นต้องเก็บไว้ในจุดเดียวกัน

ทำลายบรรทัดคำสั่ง:

  • -avz: โหมดเก็บถาวรใช้คำสั่งบีบอัดในระหว่างการถ่ายโอน
  • --delete: ลบไฟล์ที่ซิงค์ที่ไม่มีอยู่ในแหล่งที่มา
  • -e ssh: ใช้ ssh เป็นวิธีการเชื่อมต่อ

แน่นอนว่าการโทรนี้จะขอรหัสผ่านจากคุณเมื่อคุณโทร หากคุณต้องการทำสิ่งนี้โดยอัตโนมัติคุณจะต้องแชร์คีย์ระหว่างบัญชีในเครื่องและใช้การเข้ารหัสคีย์สาธารณะ - ส่วนตัวเพื่อทำการเชื่อมต่อ ssh

ในการตั้งค่าคู่คีย์ของคุณสำหรับ rysnc นี้ให้รันคำสั่งต่อไปนี้บนเครื่องต้นทางของคุณ:

> ssh-keygen -t rsa -b 2048 -f ~/.ssh/my-rsync-key 
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): [press enter here] 
Enter same passphrase again: [press enter here] 
Your identification has been saved in ~/.ssh/my-rsync-key. 
Your public key has been saved in ~/.ssh/my-rsync-key.pub. 
The key fingerprint is: 
2e:28:d9:ec:85:21:e7:ff:73:df:2e:07:78:f0:d0:a0 root@source

> chmod 600 ~/.ssh/my-rsync-key

สำหรับ keypair การทำงานเราต้องเพิ่มเนื้อหาของ~/.ssh/my-rsync-key.pubไปยัง~<remoteuser>/.ssh/authorized_keysไฟล์บนอ่างล้างจานเครื่อง

ก่อนอื่นให้คัดลอกไฟล์ไปที่เครื่องsink :

scp ~/.ssh/my-rsync-key.pub remoteuser@sink:~

จากนั้น ssh ไปที่sink machine และอิมพอร์ตคีย์โดยรันสิ่งต่อไปนี้เป็นremoteuserบนเครื่อง:

> if [ ! -d ~/.ssh ]; then mkdir ~/.ssh ; chmod 700 ~/.ssh ; fi
cd ~/.ssh/ 
if [ ! -f authorized_keys ]; then touch authorized_keys ; chmod 600 authorized_keys ; fi 
cat ~/my-rsync-key.pub >> authorized_keys
rm ~/my-rsync-key.pub

สำหรับเคล็ดลับเพิ่มเติมเกี่ยวกับการล็อคลง SSH เชื่อมต่อระหว่างคุณแหล่งที่มาและอ่างล้างจานเครื่องเราขอแนะนำให้ดูที่หน้านี้

จากเครื่องต้นทางของคุณคุณสามารถทดสอบว่าการตั้งค่านี้ทำงานโดยการเรียกใช้:

rsync -avz --dry-run -e "ssh -i ~/.ssh/my-rsync-key" /my/tree/ remoteuser@sink:/my/tree

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

ตอนนี้เราต้องการวิธีที่ง่ายในการเรียกคำสั่ง rsync นี้จากไฟล์กำหนดค่า LaunchD ดังที่แสดงในคำตอบที่เป็นประโยชน์ในเว็บไซต์นี้ เนื่องจากคุณต้องการให้การโทรนี้เกิดขึ้นในวงแคบคุณจะต้องแน่ใจว่าคุณไม่มี rsync หลายสำเนาที่ทำงานพร้อมกัน คุณสามารถใช้ flock เพื่อสร้าง mutexที่ทำให้มั่นใจได้ว่าสคริปต์ bash นั้นเป็นแบบซิงเกิล: มีเพียงอินสแตนซ์เดียวเท่านั้นที่มันรันทุกครั้งในเครื่องเดียว ดังนั้นเราจะสร้างสคริปต์ต่อไปนี้บนดิสก์:

#!/bin/sh
SINK_INSTANCE=remoteuser@sink
DIR=/my/tree
KEY=~/.ssh/my-rsync-key
LOG = ~/my_rsync.log
LOCK = ~/my_rsync.lock
SOURCE=/my/tree

exec 9>${LOCK}
if ! flock -n 9  ; then
    echo "Another instance of your rsync is already running";
    exit 1
fi

echo "----------" >> ${LOG}
echo `date` >> ${LOG}

rsync -avz --delete -e "ssh -i ${KEY}" \
    ${SOURCE}/ {SINK_INSTANCE}:${SOURCE} 2>&1 >> ${LOG}

~/my_rsync.shบันทึกว่า

สคริปต์นั้นจะดูแล rsync ให้คุณ สิ่งที่คุณต้องทำตอนนี้คือตั้งค่าผ่านทาง LaunchD และให้มันทำงานแบบวนซ้ำ ทำตามคำแนะนำจากที่นี่และแก้ไขเพื่อตอบสนองความต้องการของเราเราจะสร้าง~/Library/LaunchAgents/my-rsync.plistในโปรแกรมแก้ไขข้อความและสร้างเนื้อหา:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
 "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>My Rsync</string>
    <key>Program</key>
    <string>/bin/sh</string>
    <key>ProgramArguments</key>
    <array>
        <string>sh</string>
        <string>-c</string>
        <string>while sleep 5s; /Users/my/my_rsync.sh; done</string>
    </array>
    <key>ServiceDescription</key>
    <string>Keep /my/tree synchronized with the machine sink</string>
    <key>KeepAlive</key>
    <true/>
</dict>
</plist>

ที่ควรดูแลสิ่งต่าง ๆ

caveats ปกติใช้: ฉันเขียนจากหน่วยความจำและไม่ได้ทดสอบ ดังนั้นอย่าทำตามสุ่มสี่สุ่มห้า ทดสอบอย่างระมัดระวังระหว่างทาง เมื่อใดก็ตามที่คุณมีข้อสงสัยให้ใช้--dry-runตัวเลือกใน rsync มันจะพิมพ์สิ่งที่จะทำโดยไม่ได้ทำอะไรเลย


2

แทนการรันrsyncทุกๆ 5 วินาทีคุณสามารถใช้ lsyncd daemon เพื่อดูแผนผังไดเร็กทอรี

มันใช้งานได้ใน OS X ผ่าน/dev/fseventsแต่ฉันไม่มี.debไฟล์ปลั๊กอินที่พร้อมใช้งาน เป็นเรื่องเล็กน้อยที่รวบรวมและติดตั้ง จนกว่าฉันจะปล่อยรุ่น 2.0.6 (เร็ว ๆ นี้) ฉันแนะนำให้ใช้หัว GIT เนื่องจาก lsyncd 2.0.5 มีข้อบกพร่องของ OS X ที่รู้จักบ้าง


ฉันเพิ่งเปิดตัว OSX เวอร์ชันที่แก้ไขแล้ว แตกต่างจากการเสียทรัพยากรโดยใช้บางสิ่งบางอย่างทุก 5 วินาทีแม้ว่าจะไม่มีอะไรเกิดขึ้น Lsyncd จะโทร rsync เฉพาะเมื่อมีอะไรเกิดขึ้น
axkibe

1

rsyncจะเป็นเครื่องมือที่ยอดเยี่ยมสำหรับสิ่งนี้และมันถูกสร้างไว้ใน Mac OS มันจะตรวจสอบความแตกต่างระหว่างสองสถานที่แล้วคัดลอกการเปลี่ยนแปลงของเดลต้าผ่านเครือข่ายเท่านั้น rsync โดยไม่มีการตั้งค่าสถานะพิเศษใด ๆ เกือบจะเหมือนกับสิ่งที่คุณกำลังมองหา

การเพิ่มเพียงอย่างเดียวคือคุณจะต้องให้มันรันทุกๆ 5 วินาทีเพื่อตรวจสอบการเปลี่ยนแปลง คุณสามารถทำได้โดยใช้ launchd ด้วยตัวอย่างที่ยอดเยี่ยมบนไซต์นี้แล้ว ในตัวอย่างนี้ดูเหมือนว่าสคริปต์จะยังคงทำงานอยู่จากนั้นนอน 5 วินาทีจากนั้นเรียกใช้อีกครั้ง

ปัญหาในการใช้งานบ่อยครั้งก็คือเครื่องมือจะต้องตรวจสอบความแตกต่างด้วยและหากมีการเปลี่ยนแปลงมากมายใน 5 วินาทีค่าโสหุ้ยในการบันทึกการเปลี่ยนแปลงเหล่านั้นและการถ่ายโอนอาจใช้เวลามากกว่า 5 วินาที


0

Folderwatch เป็น Appstore เพียง $ 11.99 ทางเลือกเชิงพาณิชย์ Folderwatch ซิงค์โฟลเดอร์ (มิร์เรอร์) บนวอลุ่มที่จัดรูปแบบ HFS-Plus ในแบบเรียลไทม์ไปยังไดรฟ์ภายนอกและไฟล์เซิร์ฟเวอร์ AFP http://itunes.apple.com/us/app/folderwatch/id408224368?mt=12


0

ฉันใช้ FolderSync (8.99 App store) และชอบมันมาก Nice UI พร้อมการค้นหาแบบซิงโครไนซ์ในสองบานหน้าต่าง ช่วยให้คุณบันทึกงานซิงค์เพื่อใช้งานในภายหลัง

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