Phần mềm để đồng bộ hóa hai thư mục (cục bộ / từ xa)


Câu trả lời:


12

rsync chắc chắn là công cụ phù hợp cho công việc này. Nó tồn tại để giữ các thư mục đồng bộ và có thể làm điều đó với một chút thông minh. Ví dụ: nó sẽ chỉ chuyển deltas bất cứ khi nào có thể và nó có thể hoạt động trên các đường hầm ssh.

Giả sử bạn có nguồn máy lưu trữ phiên bản trực tiếp của cây thư mục /my/treevà máy chìm mà bạn muốn giữ đồng bộ chặt chẽ với nó. Nếu bạn có tài khoản ssh bị chìm, bạn có thể, từ nguồn sử dụng rsync như sau:

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

Điều này giả định rằng bạn muốn /my/treeở cùng một vị trí trên bồn rửa giống như bạn có nó trên nguồn . Tất nhiên, bạn không cần phải giữ nó ở cùng một vị trí.

Phá vỡ dòng lệnh:

  • -avz: chế độ lưu trữ, tiết lộ, sử dụng nén trong khi chuyển
  • --delete: xóa các tệp trên đồng bộ hóa không có trên nguồn
  • -e ssh: Sử dụng ssh làm phương thức kết nối

Cuộc gọi này, tất nhiên, sẽ hỏi bạn mật khẩu khi bạn thực hiện. Nếu bạn muốn thực hiện việc này theo cách tự động, bạn sẽ cần chia sẻ một số khóa giữa các tài khoản trên máy và sử dụng mã hóa khóa riêng tư để tạo kết nối ssh.

Để thiết lập cặp khóa của bạn cho rysnc này, hãy chạy lệnh sau trên máy nguồn của bạn :

> 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

Đối với cặp khóa này để làm việc chúng ta cần thêm các nội dung của ~/.ssh/my-rsync-key.pubđến ~<remoteuser>/.ssh/authorized_keystập tin trên bồn rửa máy.

Đầu tiên sao chép tập tin vào máy chìm :

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

Sau đó ssh vào máy chìm và nhập khóa bằng cách chạy như dưới đây là bộ điều khiển từ xa trên máy:

> 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

Để biết thêm mẹo về cách khóa kết nối ssh giữa nguồn và máy chìm của bạn , tôi khuyên bạn nên xem trang này .

Từ máy nguồn của bạn, bạn có thể kiểm tra xem thiết lập này có hoạt động không bằng cách chạy:

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

Điều đó sẽ làm khô một rsync. Nếu bạn thấy lệnh rsync kết nối và so sánh các tệp bạn biết mọi thứ được thiết lập đúng.

Bây giờ chúng ta cần một cách dễ dàng để gọi lệnh rsync này từ tệp cấu hình LaunchD như trong câu trả lời hữu ích này trên trang web này . Vì bạn muốn cuộc gọi này diễn ra trong một vòng lặp chặt chẽ, bạn sẽ cần đảm bảo rằng bạn không có nhiều bản sao của rsync chạy cùng một lúc. Bạn có thể sử dụng đàn để tạo một mutex đảm bảo tập lệnh bash là singleton: chỉ một phiên bản của nó chạy mỗi lần trên một máy. Vì vậy, chúng tôi sẽ tạo tập lệnh sau trên đĩa:

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

Lưu mà như ~/my_rsync.sh.

Kịch bản đó sẽ đảm nhiệm việc thực hiện rsync cho bạn. Tất cả những gì bạn cần làm bây giờ là thiết lập nó thông qua LaunchD và để nó chạy trong một vòng lặp chặt chẽ. Thực hiện theo các hướng dẫn từ đây và sửa đổi nó để đáp ứng nhu cầu của chúng tôi, chúng tôi sẽ tạo ~/Library/LaunchAgents/my-rsync.plisttrong trình chỉnh sửa văn bản và tạo nội dung:

<?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>

Điều đó nên chăm sóc mọi thứ.

Hãy cẩn thận thông thường: Tôi đã viết điều này từ bộ nhớ và không kiểm tra nó. Vì vậy, đừng theo dõi một cách mù quáng. Kiểm tra cẩn thận trên đường đi. Bất cứ khi nào bạn nghi ngờ, hãy sử dụng --dry-runtùy chọn trên rsync. Nó sẽ in ra những gì nó sẽ làm mà không thực sự làm gì.


2

Thay vì chạy rsynccứ sau 5 giây, bạn có thể sử dụng trình nền lsyncd để xem cây thư mục.

Nó hoạt động trong OS X thông qua /dev/fsevents, nhưng tôi không có .debtệp sẵn sàng cho plugin . Đó là một chút geeky để có được nó được biên dịch và cài đặt. Cho đến khi tôi phát hành phiên bản 2.0.6 (sớm) tôi sẽ khuyên bạn nên sử dụng đầu GIT, vì lsyncd 2.0.5 có một số lỗi OS X đã biết.


Tôi vừa phát hành một phiên bản cố định OSX. Khác với việc phải lãng phí nguồn tài nguyên bằng cách chạy thứ gì đó cứ sau 5 giây mặc dù có khả năng không có gì xảy ra, Lsyncd sẽ chỉ gọi rsync khi có chuyện xảy ra.
axkibe

1

rsync sẽ là một công cụ tuyệt vời cho việc này và nó được tích hợp vào Mac OS. Nó sẽ kiểm tra sự khác biệt giữa hai vị trí và sau đó chỉ sao chép các thay đổi delta trên mạng. rsync mà không có bất kỳ cờ bổ sung nào gần như chính xác những gì bạn đang tìm kiếm.

Sự bổ sung duy nhất là bạn sẽ cần chạy nó cứ sau 5 giây để kiểm tra các thay đổi. Bạn có thể làm điều này bằng cách sử dụng launchd, với một ví dụ tuyệt vời đã có trên trang web này . Trong ví dụ này, có vẻ như tập lệnh được tiếp tục chạy, và sau đó ngủ 5 giây, sau đó chạy lại.

Vấn đề với việc chạy điều này thường xuyên là công cụ cũng sẽ phải kiểm tra sự khác biệt và nếu có quá nhiều thay đổi trong 5 giây, chi phí để ghi lại những thay đổi đó và chuyển chúng có thể mất hơn 5 giây.



0

Tôi đã và đang sử dụng FolderSync (Cửa hàng ứng dụng 8,99) và thực sự thích nó. Giao diện người dùng đẹp với trình duyệt được đồng bộ hóa trong hai bảng. Cho phép bạn lưu một công việc đồng bộ hóa để sử dụng lại sau này.

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.