Unison - Автоматическая синхронизация компьютеров

Существует ли способ автоматической синхронизации двух компьютеров (например, отдельных каталогов в домашней папке) с помощью Unison? Если нет, есть ли альтернатива, которая может это сделать? Я не полностью против того, чтобы постоянно открывать Unison и выполнять синхронизацию вручную, но когда он открывается, вы должны выбрать профиль, который соответствует только одному каталогу, поэтому вы должны синхронизировать каждый по отдельности. Добавьте к этому, IP-адрес является динамическим, и поэтому должен быть отредактирован. Это довольно утомительно, и, кажется, должен быть более простой способ. Я что-то пропустил? Есть ли способ упростить этот процесс (возможно, bash-скрипт)?

2 ответа

Решение

Я бы предложил решить проблему динамического IP-адреса (большинство маршрутизаторов имеют концепцию резервирования адресов, которую можно использовать для "исправления" IP-адреса вашего компьютера). После этого вы можете использовать версию командной строки unison:

unison -auto -batch profilename 

и вы можете добавить его в свои сценарии входа / выхода или как задание cron.

Если вам все еще нужно изменить IP, вы можете использовать sed в скрипте:

  1. создать файл шаблона в ~/.unison, newprof.tmpl, как это:

    root = /home/romano/
    root = ssh://romano@MYIPHERE//home/romano/
    
    path = education
    path = research
    
  2. создайте следующий скрипт, назовите его sync_newprof:

    #!/bin/bash
    # 
    cd $HOME/.unison
    cat newprof.tmpl | sed s/MYIPHERE/$1 >! newprof.prf
    unison -auto -batch profilename
    

    в основном мы создаем файл профиля, меняя слово MYIPHERE с помощью первого аргумента скрипта

  3. теперь вы можете назвать это как

    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-соединениях на основе пароля.

Другие вопросы по тегам