คำตอบ:
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 มันจะพิมพ์สิ่งที่จะทำโดยไม่ได้ทำอะไรเลย
แทนการรันrsync
ทุกๆ 5 วินาทีคุณสามารถใช้ lsyncd daemon เพื่อดูแผนผังไดเร็กทอรี
มันใช้งานได้ใน OS X ผ่าน/dev/fsevents
แต่ฉันไม่มี.deb
ไฟล์ปลั๊กอินที่พร้อมใช้งาน เป็นเรื่องเล็กน้อยที่รวบรวมและติดตั้ง จนกว่าฉันจะปล่อยรุ่น 2.0.6 (เร็ว ๆ นี้) ฉันแนะนำให้ใช้หัว GIT เนื่องจาก lsyncd 2.0.5 มีข้อบกพร่องของ OS X ที่รู้จักบ้าง
rsyncจะเป็นเครื่องมือที่ยอดเยี่ยมสำหรับสิ่งนี้และมันถูกสร้างไว้ใน Mac OS มันจะตรวจสอบความแตกต่างระหว่างสองสถานที่แล้วคัดลอกการเปลี่ยนแปลงของเดลต้าผ่านเครือข่ายเท่านั้น rsync โดยไม่มีการตั้งค่าสถานะพิเศษใด ๆ เกือบจะเหมือนกับสิ่งที่คุณกำลังมองหา
การเพิ่มเพียงอย่างเดียวคือคุณจะต้องให้มันรันทุกๆ 5 วินาทีเพื่อตรวจสอบการเปลี่ยนแปลง คุณสามารถทำได้โดยใช้ launchd ด้วยตัวอย่างที่ยอดเยี่ยมบนไซต์นี้แล้ว ในตัวอย่างนี้ดูเหมือนว่าสคริปต์จะยังคงทำงานอยู่จากนั้นนอน 5 วินาทีจากนั้นเรียกใช้อีกครั้ง
ปัญหาในการใช้งานบ่อยครั้งก็คือเครื่องมือจะต้องตรวจสอบความแตกต่างด้วยและหากมีการเปลี่ยนแปลงมากมายใน 5 วินาทีค่าโสหุ้ยในการบันทึกการเปลี่ยนแปลงเหล่านั้นและการถ่ายโอนอาจใช้เวลามากกว่า 5 วินาที
Folderwatch เป็น Appstore เพียง $ 11.99 ทางเลือกเชิงพาณิชย์ Folderwatch ซิงค์โฟลเดอร์ (มิร์เรอร์) บนวอลุ่มที่จัดรูปแบบ HFS-Plus ในแบบเรียลไทม์ไปยังไดรฟ์ภายนอกและไฟล์เซิร์ฟเวอร์ AFP http://itunes.apple.com/us/app/folderwatch/id408224368?mt=12
ฉันใช้ FolderSync (8.99 App store) และชอบมันมาก Nice UI พร้อมการค้นหาแบบซิงโครไนซ์ในสองบานหน้าต่าง ช่วยให้คุณบันทึกงานซิงค์เพื่อใช้งานในภายหลัง