Unison - Автоматическая синхронизация компьютеров
Существует ли способ автоматической синхронизации двух компьютеров (например, отдельных каталогов в домашней папке) с помощью Unison? Если нет, есть ли альтернатива, которая может это сделать? Я не полностью против того, чтобы постоянно открывать Unison и выполнять синхронизацию вручную, но когда он открывается, вы должны выбрать профиль, который соответствует только одному каталогу, поэтому вы должны синхронизировать каждый по отдельности. Добавьте к этому, IP-адрес является динамическим, и поэтому должен быть отредактирован. Это довольно утомительно, и, кажется, должен быть более простой способ. Я что-то пропустил? Есть ли способ упростить этот процесс (возможно, bash-скрипт)?
2 ответа
Я бы предложил решить проблему динамического IP-адреса (большинство маршрутизаторов имеют концепцию резервирования адресов, которую можно использовать для "исправления" IP-адреса вашего компьютера). После этого вы можете использовать версию командной строки unison:
unison -auto -batch profilename
и вы можете добавить его в свои сценарии входа / выхода или как задание cron.
Если вам все еще нужно изменить IP, вы можете использовать sed
в скрипте:
создать файл шаблона в
~/.unison
,newprof.tmpl
, как это:root = /home/romano/ root = ssh://romano@MYIPHERE//home/romano/ path = education path = research
создайте следующий скрипт, назовите его
sync_newprof
:#!/bin/bash # cd $HOME/.unison cat newprof.tmpl | sed s/MYIPHERE/$1 >! newprof.prf unison -auto -batch profilename
в основном мы создаем файл профиля, меняя слово MYIPHERE с помощью первого аргумента скрипта
теперь вы можете назвать это как
sync_newprof 1.1.1.1
и он создаст профиль с заданным IP и синхронизирует.
В локальной сети у вас есть две машины, на которых вы хотите безопасно и автоматически синхронизировать /home/<username>/Desktop
каждые 10 минут: "Хост", который запускает ваш сервер OpenSSH, и "Клиент", который подключается через SSH к "Хосту".
Обзор решения *
- Настройте сервер OpenSSH на хосте
- Установите Unison на клиент и хост
- Создайте сценарий 1 так, чтобы
cron
можешь использовать<username>
ключ RSA - Добавьте две строки в
<username>
crontab, и - Установите скрипт 1 для запуска при запуске.
Настройка сервера OpenSSH на хосте
См. Настройка SFTP-сервера, чтобы настроить сервер OpenSSH, который прослушивает соединения SSH, как <username>
на хосте использует статический IP, прослушивает нестандартный порт, отказывается от соединений на основе пароля и разрешает соединения с ключом RSA, если хост обладает RSA public_key.
Установите Unison на клиент и хост
Запустите на обеих машинах (если хотите, unison-gtk - это GUI):
sudo apt-get install unison unison-gtk
Создать один скрипт
cron
не разделяет ту же СРЕДУ, что и <username>
и, следовательно, не сможет найти клиентский ключ RSA, необходимый для подключения к хосту. Сценарий 1 предусматривает, что ОКРУЖАЮЩАЯ СРЕДА <username>
файл crontab.
Сценарий 1 также генерирует сценарий 2, который выполняется <username>
Создает файл crontab каждые 10 минут и запускает Unison.
- ПРЕДОСТЕРЕЖЕНИЕ! Я не эксперт по сценариям и адаптировал это [1]
Сценарий 1 (/home/<username>/Documents/Scripts/set_ssh_env_for_cron_unison.sh
)
#!/bin/sh
SSH_ENV=$HOME/.ssh/environment_for_cron ## file to be generated
SSH_ENV2=$HOME/Documents/Scripts/unison_sync.sh ## Script 2 to be generated
function start_agent {
echo "Initialising new SSH agent..."
env | grep SSH | sed 's/SSH_AUTH_SOCK=//' > ${SSH_ENV} ## send output of env | grep SSH minus "SSH_AUTH_SOCK=" so cron can get output from SSH_ENV
## create a new script with three lines, line 3 is unison command
echo "#!/bin/sh" > ${SSH_ENV2} ## line 1
env | grep SSH >> ${SSH_ENV2} ## line 2
echo "/usr/bin/unison /home/<username>/Desktop ssh://<Host's local IP address>:<Host's listening SSH Port>//home/<username>/Desktop -batch -debug update+ -ignore 'Name *.gvfs' -ignore 'Name .cache*' -ignore 'Name [Cc]ache*' -ignore 'Name .thumbnails*' -ignore 'Name [Tt]rash*' -ignore 'Name *.backup*' -ignore 'Name *~' -ignore 'Name .dropbox*' -ignore 'Name /proc/*' -ignore 'Name /sys/*' -ignore 'Name /dev/*' -ignore 'Name /run/*' -ignore 'Name /root/Ubuntu One/*'" >> ${SSH_ENV2} ## line 3
echo succeeded
chmod 644 ${SSH_ENV} ## change permissions so cron can read SSH_ENV
chmod 775 ${SSH_ENV2} ## change permissions so cron can execute SSH_ENV2
. ${SSH_ENV} > /dev/null
ssh-add id_rsa ## unlocks your RSA key and loads it into the ssh-agent which holds keys in memory throughout login session
}
if [ -f "${SSH_ENV}" ]; then
. ${SSH_ENV} > /dev/null
ps -ef | grep ${SSH_AGENT_PID} | grep ssh-agent$ > /dev/null || {
start_agent;
}
else
start_agent;
fi
редактировать <username>
crontab для выполнения синхронизации каждые 10 минут
crontab -e
Теперь добавьте следующие строки в <username>
crontab
SSH_AUTH_SOCK=/home/<username>/.ssh/environment_for_cron
*/10 * * * * /home/<username>/Documents/Scripts/unison_sync.sh
- Убедитесь, что в новом файле crontab есть новая пустая строка после двух строк выше!
Выход с помощью Ctrl+x; y
для "ДА"; Введите для подтверждения. Проверьте файл crontab:
crontab -l
Установите скрипт 1 для запуска при запуске
использование Dash
> Startup Applications
(или же Applications
> System Tools
> Preferences
на Gnome), чтобы добавить новую программу запуска. Там, где написано "Command:", введите:
/home/<username>/Documents/Scripts/set_ssh_env_for_cron_unison.sh
Поздравляем!
Если все прошло успешно, вы введете пароль для ключа RSA Клиента при входе в систему, и вам не нужно будет вводить пароль повторно в течение сеанса входа в систему. Каждые 10 минут клиент будет автоматически согласовывать SSH-соединение без пароля с хостом, а Unison будет синхронизировать /home/<username>/Desktop
а также //HOST//home/<username>/Desktop
, Ваш ноутбук и рабочий стол теперь могут быть объединены в святую синхронизацию.
*Подробности:
Моя окончательная настройка сообщается как <username>
(не root
) использование нестандартного порта SSH для "хоста" со статическим IP. Аутентификация с помощью пароля отключена на "Хосте" (требуется предварительно аутентифицированный ключ RSA), в то время как мой ключ RSA на "Клиенте" требует пароль для использования (один раз за сеанс входа в систему). Таким образом, злоумышленнику необходимо угадать правильный порт, ключ RSA и пароль, чтобы создать оболочку в виде <username>
с "Host".
После одной записи пароля на сеанс входа в систему "Клиент" и "Хост" автоматически синхронизируются каждые 10 минут. Это был метод, который я нашел, будет работать, используя <username>
ключ RSA и cron
ОКРУЖАЮЩАЯ СРЕДА.**
ПРЕДОСТЕРЕЖЕНИЕ! Конечно, если одна или обе машины отключены, выключены и т. Д., Они не будут синхронизироваться!
** Пожалуйста, не стесняйтесь, дайте нам знать, если есть более простой метод, использующий ключ RSA, принадлежащий root
на клиенте, которому не требуется пароль для использования, в то время как хост одновременно отказывает в SSH-соединениях на основе пароля.