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

Вот соединение:

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

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

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

Traiditionally я использовал взлом ssh+tar, как таковой:

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

И это работает отлично, но я хотел бы взять его шаг вперед и получить rsync, работающий между этими двумя серверами ЧЕРЕЗ мой рабочий стол.

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

  • Одна команда лайнера в rsync файлы от Server1 до server2 ЧЕРЕЗ мой рабочий стол
  • все на ОДНОЙ командной строке, одном окне терминала
  • Я хочу порт, вперед туннелируют, чтобы только существовать для жизни команды rsync.
  • Я не хочу к scp, я хочу к rsync.

У кого-либо есть прием для того, чтобы сделать это?

Править: Вот рабочая команда! Большая работа все: 1. Для rsa ключевого пути, не может использовать tildae, должен был использовать "/корень /". 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"

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

8
задан 27.08.2010, 14:06

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 локален для Вас затем, Вы могли бы просто удалить локальную копию впоследствии (поскольку это будет быстро для восстановления по локальной LAN в следующий раз).

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

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

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

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

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

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

Править: При слиянии моего взлома с Aaron для предотвращения всего слоняния без дела с копиями/bin/sh и отдельным активным сценарием на 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:22 server2.

Редактирование 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, который мог использоваться в качестве copy+paste остроты вместо сценария.

5
ответ дан 07.12.2019, 14:10

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

  • Настройте реверс ssh туннель от server1 до Вашего рабочего стола (извините, я не могу сказать Вам .ssh/config колдовство первое, что пришло на ум). Объедините его в цепочку с соединением от Вашего рабочего стола до server2. Выполненный rsync от server1.

  • Настройте прокси носков (или прокси HTTP, который принимает ПОДКЛЮЧЕНИЕ) на Вашем рабочем столе. Используйте его для установления соединения SSH от server1 до server2. Выполненный rsync от server2.

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

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

2
ответ дан 07.12.2019, 14:10

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

#!/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
ответ дан 07.12.2019, 14:10

Теги

Похожие вопросы