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/tree
và 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_keys
tậ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.plist
trong 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-run
tù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ì.