Вот связь:
[Server1] <---> [my desktop] <---> [Server2]
Сервер1 и сервер2 не могут напрямую общаться друг с другом (не спрашивайте). Мой рабочий стол, однако, может получить доступ к обоим серверам через SSH.
Мне нужно скопировать файлы с сервера1 на сервер2.
Традиционно я использую ssh + tar, как таковой:
ssh -q root@Server1 'tar -vzc /path/to/files ' | ssh -q root@Server2 'tar -vzx -C /'
И это прекрасно работает, но я хотел бы сделать еще один шаг и заставить rsync работать между двумя серверами VIA на моем рабочем столе.
Теперь я знаю, что могу запустить туннель пересылки портов ssh в одном терминале и затем выполнить rsync через этот туннель в другом окне, но я не хочу возиться со вторым терминалом или создавать и разбивать отдельный туннель переадресации портов. что я хочу это:
- Одна команда liner для rsync файлов с сервера 1 на сервер 2 через мой рабочий стол
- все в ОДНОЙ командной строке, одно окно терминала
- Я хочу, чтобы туннель переадресации портов существовал только в течение жизни команды rsync.
- Я не хочу scp, я хочу rsync.
У кого-нибудь есть хитрость для этого?
РЕДАКТИРОВАТЬ: Вот рабочая команда! Отличная работа для всех: 1. Для пути ключа rsa, не могу использовать 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"
Бум идет динамитом.
Ответы:
Если вы счастливы сохранить копию данных на промежуточном компьютере, вы можете просто написать сценарий, который обновил локальную копию, используя server1 в качестве ссылки, а затем обновил резервную копию на server2, используя локальную копию в качестве ссылки:
Использование простого сценария означает, что вам нужна единственная команда, чтобы сделать все. Конечно, это может быть защита «нет-нет», если данные конфиденциальны (вы или другие сотрудники вашей компании, возможно, не захотите, чтобы копия находилась на вашем ноутбуке). Если server1 является локальным для вас, вы можете просто удалить локальную копию впоследствии (так как в следующий раз будет легко восстановить по локальной сети).
Построение туннеля, чтобы серверы могли более эффективно общаться друг с другом, должно быть возможно следующим образом:
На сервере 2 создайте сценарий, который выполняет только цикл ожидания в течение нескольких секунд, а затем выводит небольшое количество текста, и использует для этого теперь «копию» sh:
(
echo
вероятно, в этом нет необходимости, так как сеанс не будет простаивать достаточно долго для тайм-аута, даже если SSHd настроен на игнорирование пакетов keep-alive от клиента ssh)Теперь вы можете написать скрипт на своем ноутбуке, который запускает обратный туннель в фоновом режиме, говорит server1 использовать rsync для выполнения операции копирования, а затем убивает обратный туннель, убивая зацикленный скрипт (который закроет сеанс SSH):
Как это работает:
Это не кажется особенно чистым, но это должно работать. Я не проверял вышеизложенное, поэтому вам может понадобиться настроить его. Создание команды rsync в виде однострочного сценария на сервере server1 может помочь, уменьшив необходимость в экранировании символов, таких как 'в вызывающей команде ssh.
Кстати: вы говорите «не спрашивайте», почему два сервера не могут видеть друг друга напрямую, но для этого часто есть веская причина. Мой домашний сервер и сервер, на котором хранятся его онлайн-резервные копии, не могут войти друг в друга (и имеют разные пароли + ключи для всех пользователей) - это означает, что если один из двух файлов взломан, он не может быть использован как простой путь к взломайте другой, чтобы мои резервные копии в Интернете были безопаснее (кто-то, кто удаляет мои данные из живого хранилища, не может использовать его для обновления резервных копий, чтобы удалить указанные резервные копии, поскольку у него нет прямой возможности доступа к основному сайту резервного копирования). Оба сервера могут подключаться к промежуточному серверу где-либо еще - живой сервер настроен на передачу своих резервных копий (через rsync) на промежуточный компьютер рано утром, а резервный сервер настроен (через некоторое время, чтобы завершить первый шаг) для подключения и собирать обновления (снова через rsyc с последующим шагом моментального снимка для сохранения нескольких возрастов резервного копирования). Эта техника может быть полезна и в ваших обстоятельствах, и если это так, я бы порекомендовал ее как более чистый способ ведения дел.
Редактировать: Объединяя мой взлом с Аароном, чтобы избежать всего этого с копиями / bin / sh и отдельным скриптом keep-alive на server2, этот скрипт на вашем ноутбуке должен делать всю работу:
Как и в предыдущем примере, rsync подключается к localhost: 2222, который переходит вниз по туннелю к localhost вашего ноутбука: 2222, который пересылает через другой туннель к local2 сервера server2: 22.
Редактировать 2: Если вы не возражаете против наличия у server1 ключа, который позволяет ему проходить аутентификацию на сервере server2 напрямую (даже если он не видит server2 без туннеля), вы можете еще больше упростить:
где 123.123.123.123 - это общедоступный адрес для server2, который можно использовать как однострочную копию + вставку вместо сценария.
источник
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"
If you don't mind server1 having a key ...
. Можете ли вы сказать мне, действительно ли возможно избежать наличия ключа server2 на server1, пожалуйста?Вот несколько методов, которые делают синхронизацию простой однострочной, но требуют некоторых настроек.
Установите обратный ssh-туннель от server1 к вашему рабочему столу (извините, я не могу сказать вам
.ssh/config
заклинание на макушке). Цепь это с подключением с вашего рабочего стола на сервер2. Запустите rsync с сервера1.Установите прокси socks (или http прокси, который принимает CONNECT) на вашем рабочем столе. Используйте его, чтобы установить ssh-соединение с server1 на server2. Запустите rsync с сервера2.
Используйте unison вместо rsync. Но рабочий процесс отличается.
Смонтируйте каталоги с одного или обоих серверов на рабочем столе, используя sshfs .
источник
Почему одна строка? Используйте небольшой сценарий оболочки:
IIRC, вы можете установить время сна ниже; первый
ssh
не прекратится, пока кто-то использует канал.источник
sleep
иtrap
лучше, чем метод «поддержите и убейте» в моем ответе ,