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
Для этого пары ключей к работе необходимо добавить содержимое ~/.ssh/my-rsync-key.pub
в ~<remoteuser>/.ssh/authorized_keys
файл на стоковой машине.
Сначала скопируйте файл на мойку :
scp ~/.ssh/my-rsync-key.pub remoteuser@sink:~
Затем SSH к стоковой машине и импортировать ключ, выполнив следующие действия, как 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 для создания мьютекса, который гарантирует, что 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>
Это должно заботиться о вещах.
Применяются обычные предостережения: я написал это по памяти и не проверял. Так что не следуйте слепо. Тщательно проверяйте по пути. Всякий раз, когда вы сомневаетесь, используйте --dry-run
опцию rsync. Он распечатает то, что сделал бы, фактически ничего не делая.