rsync взломать отказов файлов между двумя неподключенными серверами

здесь связь:

[Server1] <---> [my desktop] <---> [Server2]

Server1 и server2 не разрешается напрямую общаться друг с другом (не спрашивайте). Мой рабочий стол, однако, может получить доступ к обоим серверам через ssh.

мне нужно скопировать файлы с сервера server1 на server2.

Traiditionally я использую SSH + tar hack, как таковой:

ssh -q root@Server1 'tar -vzc /path/to/files ' | ssh -q root@Server2 'tar -vzx -C /'

и это прекрасно работает, но я хотел бы сделать шаг вперед и получить rsync работает между два сервера через мой рабочий стол.

Теперь я знаю, что я мог бы начать ssh порт вперед туннель в одном терминале, а затем rsync через этот туннель в другом окне, но я не хочу суетиться вокруг со вторым терминалом или сделать и разорвать отдельный порт вперед туннель. чего я хочу, так это:

  • одна команда liner для rsync файлов с Server1 на server2 через мой рабочий стол
  • все в одной командной строке, одно окно терминала
  • я хочу, чтобы порт прямой туннель, чтобы существовать только для жизни команды rsync.
  • я не хочу scp, я хочу rsync.

есть ли у кого-нибудь трюк для этого?

EDIT: вот рабочая команда! Отличная работа:
1. Для ключа RSA path, нельзя использовать tildae, пришлось использовать " / root/".
2. Вот последняя командная строка:

ssh -R 2200:SERVER2:22 root@SERVER1 "rsync -e 'ssh -p 2200 -i /root/.ssh/id_rsa_ROOT_ON_SERVER2' --stats --progress -vaz /path/to/big/files root@localhost:/destination/path"

бум идет динамит.

5
задан regulatre
15.04.2023 6:09 Количество просмотров материала 3116
Распечатать страницу

3 ответа

если вы счастливы сохранить копию данных на промежуточной машине, то вы можете просто написать сценарий, который обновил локальную копию, используя server1 в качестве ссылки, а затем обновил резервную копию на server2, используя локальную копию в качестве ссылки:

#!/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

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

строительство туннеля, чтобы серверы могли эффективно общаться друг с другом более напрямую, должно быть возможно следующим образом:

  1. на сервере 2 Сделайте копию /bin / sh как /usr/local/bin / shforkeepalive. Используйте символическую ссылку, а не копию, тогда вам не нужно обновлять ее после обновлений безопасности, которые исправляют / bin / sh.
  2. на сервере 2 создать скрипт, который ничего не делает, но цикл сна в течение нескольких секунд, то эхо небольшое количество текста, и это использовать теперь "копировать" из sh:

    #!/usr/local/bin/shforkeepalive
    while [ "1" != "0" ]; do
            echo Beep!
            sleep 5
    done
    

    (том echo вероятно, не требуется, так как сеанс не будет простаивать достаточно долго до истечения времени ожидания, даже если SSHd настроен на игнорирование пакетов keep-alive от клиента ssh)

  3. теперь вы можете написать сценарий на вашем ноутбуке, который начинается ваш обратный туннель в фоновом режиме, говорит 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: стандартная" команда для интерпретации этого скрипта " marker
  • строка 2: Запустите соединение SSH с обратным туннелем и запустите сценарий keepalive через него, чтобы сохранить его открытым. Трейлинг & сообщает bash, чтобы запустить это в фоновом режиме, так что следующие строки можно запустить, не дожидаясь его окончания
  • строка 3: запустите туннель, который соединится с туннелем выше, чтобы server1 мог видеть server2, и запустите rsync для выполнения копирования / обновления по этому расположению
  • строка 4: убейте сценарий keep-alive после завершения операции rsync (и так возвращается второй вызов SSH), который будет и первый сеанс ssh.

это не особо чистые, но это должен работать. Я не тестировал выше, поэтому вам может потребоваться настроить его. Создание команды rsync в одной строке сценария на server1 может помочь, уменьшая необходимость экранировать символы, такие как ' на вызывающей команде ssh.

BTW: вы говорите "Не спрашивайте", почему два сервера не могут видеть друг друга напрямую, но часто есть веская причина для этого. Мой домашний сервер и сервер его онлайн резервного копирования проводятся на не могут войти друг к другу (и имеют разные пароли + ключи для всех пользователей) - это означает, что если один из двух взломан он не может быть использован как легкий путь, чтобы взломать другие так что мой онлайн-архивам безопаснее (кто-то вредоносного удаления моих данных из текущий не может использовать свою способность для обновления резервных копий, удаление заявил резервные копии, так как он не имеет прямой возможности прикоснуться к главной резервной копии сайта). Оба сервера могут подключаться к промежуточному серверу в другом месте-живой сервер настроен на отправку своих резервных копий (через rsync) на промежуточную машину рано утром, а резервный сервер установите (некоторое время спустя, чтобы разрешить шаг один для завершения) для подключения и сбора обновлений (снова через rsyc с последующим шагом snapshotting для поддержания нескольких возрастов резервного копирования). Этот метод может быть полезен и в ваших обстоятельствах, и если это так, я бы рекомендовал его как гораздо более чистый способ делать вещи.

изменить: слияние мой хак с Аарона, чтобы избежать всех возиться с копиями /bin / sh и отдельный скрипт keep-alive на server2, этот скрипт на ваш ноутбук должен делать ВСЮ работу:

#!/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 server2: 22.

Edit 2: если вы не возражаете против server1, имеющий ключ, который позволяет ему аутентифицировать с server2 непосредственно (даже если он не может видеть server2 без туннеля) вы можете упростить дальше с:

#!/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 является публичным адресом для server2, который может быть использован в качестве копии+вставить одну строку вместо сценария.

5
отвечен David Spillett 2023-04-16 13:57

вот несколько методов, которые делают синхронизацию простой однострочной, но требуют некоторой настройки.

  • настройте обратный SSH-туннель с сервера server1 на ваш рабочий стол (извините, я не могу сказать вам .ssh/config заклинание с головы до головы). Цепь его соединения с рабочего стола на server2. Запустите rsync с сервера server1.

  • настройте прокси socks (или HTTP прокси, который принимает CONNECT) на вашем рабочем столе. Используйте его для создания ssh подключение с сервера server1 на server2. Запустите rsync с сервера server2.

  • использовать унисон вместо rsync. Но рабочий процесс отличается.

  • смонтируйте каталоги с одного или обоих серверов на рабочем столе с помощью sshfs.

2
отвечен Gilles 2023-04-16 16:14

почему одна строка? Использовать небольшой скрипт:

#!/bin/bash
# Run me on server1

# Create the port forward server1 -> desktop -> server2 (i.e.
# the first forward creates a second tunnel running on the desktop)
ssh -L/-R ... desktop "ssh -L/-R ... server2 sleep 1h" &    
pid=$!

# Kill port forward process on exit and any error
trap "kill $pid" EXIT 

rsync -e ssh /path/to/files/ root@localhost:/path/to/files/on/server2

IIRC, вы можете установить время сна ниже; первый ssh не прекращается, пока кто-то использует канал.

1
отвечен Aaron Digulla 2023-04-16 18:31

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх