Я хотел бы передавать файлы между двумя удаленными узлами, используя локальную оболочку, но кажется, что rsync не поддерживает синхронизацию, если два удаленных узла указаны следующим образом:
$ rsync -vuar host1:/var/www host2:/var/www
The source and destination cannot both be remote.
Какие другие обходные пути / команды я мог бы использовать для достижения аналогичных результатов?
sshfs
заключается в том,rsync
что исходная и целевая файловые системы рассматриваются как локальные, поэтому он отключает свой дельта-алгоритм. На этом этапе вы почти могли бы просто использоватьcp -p
. Смотрите ответ, который предлагает это и его последующие комментарии.Ответы:
Как вы обнаружили, вы не можете использовать rsync с удаленным источником и удаленным назначением. Предполагая, что два сервера не могут общаться друг с другом напрямую, можно использовать ssh для туннелирования через локальный компьютер.
Вместо
Вы можете использовать это
Если вам интересно,
-R
опция устанавливает обратный канал от порта 50000 на хосте 1, который отображается (через локальный компьютер) на порт 22 на хосте 2. Прямого соединения между host1 и host2 нет.источник
sshfs
для локального монтирования обоих удаленных каталогов, а затем использовал ихrsync
для двух локально монтируемых каталогов.-i
для указания ключей, необходимых для команд ssh.-i key...
параметр в кавычки послеssh
команды. Если это не помогает, пожалуйста, не стесняйтесь задавать новый вопрос, ссылаясь на этот ответ для контекстаscp -3
.Вы не сказали, почему не хотите войти на один хост, а затем скопировать на другой, поэтому я поделюсь одной из моих причин и решений.
Я не мог войти на одну машину, а затем выполнить rsync для другой, потому что ни у одного хоста не было ключа SSH, который мог бы войти на другую. Я решил эту проблему с помощью переадресации агента SSH, чтобы первый хост мог использовать мой ключ SSH, когда я вошел в систему.
ВНИМАНИЕ: Переадресация SSH позволяет хосту использовать ваш ключ SSH на время вашего входа в систему. Хотя они не могут скопировать ваш ключ, они могут войти на другие машины с ним. Убедитесь, что вы понимаете риски и не используйте переадресацию агентов на машины, которым вы не доверяете.
Следующая команда будет использовать переадресацию агента SSH, чтобы открыть прямое соединение из
host1
вhost2
. Преимущество этого заключается в том, что машина, выполняющая команду, не является узким местом передачи.источник
-D
а не-A
обход сети, а не ограничения ключа); для объяснения преимущества; потому что команда короткая; и это на самом деле работает. Обратите внимание, что вам может потребоваться указатьusername@host1
, отличается ли оно от локального имени пользователя. Кроме того, rsync выполняет проверку ключа хоста при подключении к host2, поэтому ключ host1 уже должен находиться в ~ / .ssh / known_hosts на host2, иначе команда не будет выполнена.ssh -A
, см. Слияние). jetbrains.com/display/TCD10/SSH+Agent ).Мне нравится ответ Роаймы, но пути в обоих примерах одинаковы, скрывая что есть что. Мы установили, что следующее не работает:
Но это так (я опускал явный bind_address localhost из
-R
опции, так как это по умолчанию):Обратите внимание, что вам необходимо правильно настроить ssh-ключи между двумя удаленными хостами с закрытым ключом на host1 и открытым ключом на host2.
Чтобы отладить соединение, разбейте его на две части и добавьте подробный статус:
Если это работает, у вас будет оболочка на host1. Теперь попробуйте команду rsync с host1. Я рекомендую делать это в другом окне, чтобы подробная ssh-информация не смешивалась с информацией о состоянии rsync:
источник
rsync
Инициируется на host1 с мишенью на host2. (Вы могли бы попросить разъяснения в комментарии.)Переформатирование ответа roaima в синтаксисе bash-скрипта (и добавление символов продолжения строки '\' для ясности) Я случайно выбрал порт 22000 ...
источник
Идеальный способ - запустить
rsync
один из этих серверов. Но если вы не хотите запускать скрипт на удаленном сервере. Вы можете запустить скрипт в вашей локальной системе, выполнить ssh и выполнить rsync там.ssh user@$host1 <<ENDSSH >> /tmp/rsync.out 2>&1 rsync -vuar /var/www host2:/var/www ENDSSH
Кроме того, как вы, возможно, знаете, rysnc выполняет одностороннюю синхронизацию. Если вам нужна двусторонняя синхронизация, вы можете посмотреть на osync ( https://github.com/deajan/osync ). Я использую это и нашел это полезным.
источник
Просто в качестве дополнительной информации:
Если вы используете хост перехода для соединения двух других машин, но они не могут напрямую связаться друг с другом, вы можете использовать sshfs в качестве носителя между этими двумя машинами, например, так (на хосте прыжка):
SSHFS предоставляет два пути на хосте перехода, а rsync управляет синхронизацией файлов, как всегда (только с той разницей, что это фактически выполняется локально).
источник
Вы можете запустить rsyncd (сервер) на одном из компьютеров.
Я использую этот подход, так как я не хочу использовать ssh, чтобы разрешить «источнику» (в формулировке rsync) доступ к «месту назначения» в качестве пользователя root без пароля (как это требуется для использования туннелирования SSH с rsync в скрипт)
В моем случае я просто настроил сервер rsyncd на конечном компьютере, на котором разрешен только один пользователь с исходного компьютера, и использовал rsync со стороны источника.
Работает отлично.
источник
Попробуйте использовать это. Меня устраивает.
источник
Простой в использовании скрипт
За эти годы я делал это много раз с более или менее теми же хитростями, что и в любом другом ответе здесь. Однако, потому что очень легко ошибиться в деталях и потратить много времени на выяснение проблемы, с которой я столкнулся, сценарий ниже:
ssh -A
не удается распространить данные аутентификации (не знаю, почему это иногда случается, поскольку обходной путь был легче, чем поиск основной причины)Как использовать скрипт
Как это устроено
Как я уже сказал, он использует те же приемы, что и в любом другом ответе:
-R
возможность SSH с локального хоста на host1 и в то же время создание переадресацию порта , который затем позволяет host1 подключиться через локальный к host2 (-R localhost:$FREE_PORT:$TARGET_ADDR_PORT
)-A
Опция ssh для простой аутентификации второго канала sshЭто сложно! Есть ли более простой способ?
При копировании всех или большей части байтов из источника в место назначения, это гораздо проще использовать
tar
:Сценарий
источник
tar
замечательно, когда у вас есть один (неинкрементный) перевод, и ваш перевод выполняется за один проход. С другой стороны,rsync
с переадресацией ручки перезапускаются и инкрементно переводятся.Можно использовать
tar
черезssh
для передачи файлов:Измените
j
параметр (дляtar
) наz
два, если вы хотите сжать архивgzip
, а неbzip2
. Обычноbzip2
имеет более высокое сжатие, чемgzip
, но оно медленнее, поэтому меняйте его в зависимости от ваших потребностей (см. Bzip2 vs gzip ).Связанный: Как скопировать между двумя удаленными узлами, используя tar, переданный по SSH с удаленного сервера, когда он находится за брандмауэром
В качестве альтернативы (для обеспечения безопасности полосы пропускания из-за прозрачного сжатия) можно использовать
sshfs
для монтирования удаленной файловой системы как локальную и использоватьrsync
как обычно, напримеристочник