Якщо ви раді зберігати копію даних на проміжній машині, тоді ви можете просто написати сценарій, який оновив локальну копію за допомогою сервера1 як посилання, а потім оновив резервну копію на сервері2, використовуючи локальну копію як довідку:
#!/bin/sh
rsync user@server1:/path/to/stuff /path/to/loca/copy -a --delete --compress
rsync /path/to/loca/copy user@server2:/path/to/where/stuff/should/go -a --delete --compress
Використання простого сценарію означає, що ви хотіли, щоб одна команда виконала все. Звичайно, це може бути безпекою, ні - якщо дані є конфіденційними (ви або інші особи у вашій компанії, можливо, не хочете, щоб копія плавала навколо вашого ноутбука). Якщо сервер1 є локальним для вас, ви можете просто видалити локальну копію згодом (оскільки це буде швидко відновити через локальну локальну мережу наступного разу).
Побудувати тунель, щоб сервери могли ефективніше спілкуватися один з одним безпосередньо, повинно бути можливим так:
- На сервері 2 зробіть копію / bin / sh as / usr / local / bin / shforkeepalive. Використовуйте символічне посилання, а не копію, тоді ви цього не робите; не потрібно буде оновлювати його після оновлень безпеки, які патч / бін / ш.
На сервері 2 створіть сценарій, який не робить нічого, крім циклу, який спить протягом декількох секунд, після чого повторюється невелика кількість тексту, і використовуйте для цього тепер "копію" sh:
#!/usr/local/bin/shforkeepalive
while [ "1" != "0" ]; do
echo Beep!
sleep 5
done
( echo
напевно, це не потрібно, оскільки сеанс не буде простоювати досить довго, щоб затримати час, навіть якщо SSHd налаштований ігнорувати збережені пакети від ssh-клієнта)
Тепер ви можете написати сценарій на своєму ноутбуці, який запускає ваш зворотний тунель у фоновому режимі, вказує server1 використовувати rsync для виконання операції копіювання, а потім вбиває зворотний тунель, вбиваючи циклічний цикл (який закриє сеанс SSH):
#!/bin/sh
ssh user@server2 -L2222:127.0.0.1:22 /usr/local/bin/keepalivesctipt &
ssh user@server1 -R2222:127.0.0.1:2222 rsync /path/to/stuff user@127.0.0.1:/destination/path/to/update -a --delete --compress -e 'ssh -p 2222'
ssh user@server2 killall shforkeepalive
Спосіб роботи:
- Рядок 1: стандартний "команда для інтерпретації цього сценарію"
- Рядок 2: запустити SSH-з'єднання із зворотним тунелем та запустити сценарій keepalive через нього, щоб тримати його відкритим. Trailing & каже bash запустити це у фоновому режимі, щоб наступні рядки могли працювати, не чекаючи, коли він закінчиться
- Рядок 3: запустіть тунель, який підключиться до тунелю вище, щоб сервер1 міг бачити server2 та запустити rsync, щоб виконати копіювання / оновлення для цієї домовленості
- Рядок 4: вбити сценарій збереження в живих, коли операція rsync завершиться (і так повернеться другий дзвінок SSH), що буде і першим сеансом ssh.
Це не особливо чисто, але це має працювати. Я не перевіряв вищезазначене, тому вам може знадобитися налаштувати його. Зробити команду rsync однорядковою скриптом на сервері1 може допомогти, зменшивши будь-яку необхідність уникнути символів, таких як 'у виклику команди ssh.
BTW: ви кажете "не запитувати", чому два сервери не можуть бачити один одного безпосередньо, але для цього часто є вагомі причини. Мій домашній сервер і сервер, на якому зберігаються його резервні копії в Інтернеті, не можуть входити один до одного (і мати різні паролі + ключі для всіх користувачів) - це означає, що якщо один з двох зламаний, його не можна використовувати як простий шлях до зламати інше, щоб мої онлайн-резервні копії були безпечнішими (хтось шкідливий, видаляючи мої дані з живих, не може використовувати його здатність оновити резервні копії для видалення зазначених резервних копій, оскільки він не має прямої можливості торкатися головного резервного веб-сайту). Обидва сервери можуть обидва підключитися до проміжного сервера в іншому місці - сервер в реальному часі встановлюється для того, щоб рано вранці проштовхувати його резервні копії (через rsync) на проміжну машину, а сервер резервного копіювання встановлюється (на деякий час пізніше, щоб дозволити завершити крок перший) для підключення і збирати оновлення (знову через rsyc з подальшим кроком зйомки з метою збереження кількох віків резервного копіювання). Ця методика може бути корисною і за ваших обставин, і якщо так, я рекомендував би її як набагато чистіший спосіб робити речі.
Редагувати: Об’єднавши мій хак з Аароном, щоб уникнути всіх маніпуляцій із копіями / bin / sh та окремим сценарієм збереження в режимі "живий" на сервері2, цей сценарій на вашому ноутбуці повинен виконати всю роботу:
#!/bin/sh
ssh user@server2 -L2222:127.0.0.1:22 sleep 60 &
pid=$!
trap "kill $pid" EXIT
ssh user@server1 -R2222:127.0.0.1:2222 rsync /path/to/stuff user@127.0.0.1:/destination/path/to/update -a --delete --compress -e 'ssh -p 2222'
Як і у вищесказаному, rsync підключається до localhost: 2222, який пересилає тунель вниз до localhost вашого ноутбука: 2222, який передає через інший тунель до localhost сервера2: 22.
Редагування 2: Якщо ви не заперечуєте, щоб сервер1 мав ключ, який дозволяє йому автентифікувати сервер2 безпосередньо (хоча він не може бачити сервер2 без тунелю), ви можете додатково спростити:
#!/bin/sh
ssh user@server1 -R2222:123.123.123:22 rsync /path/to/stuff user@127.0.0.1:/destination/path/to/update -a --delete --compress -e 'ssh -p 2222'
де 123.123.123.123 - це загальнодоступна адреса для сервера2, яка може використовуватися як копія + вставлення однокласника замість сценарію.