Как rsync файлы между двумя пультами?

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

$ rsync -vuar host1:/var/www host2:/var/www The source and destination cannot both be remote. 

Какие еще обходные пути / команды я мог бы использовать для достижения аналогичных результатов?

  • При пересылке SSH X11 (`ssh -X`) получите` Can not open display`, пытающийся запустить X-приложения
  • Сброс соединения с помощью serfs
  • Как распараллелить цикл for при scp-файлах?
  • Какова цель -i перед командами scp и ssh?
  • Как передать удаленный файл в stdout через scp или sftp?
  • Как скопировать между двумя удаленными узлами, используя tar, переданные в SSH с удаленного сервера, когда за брандмауэром?
  • Есть ли большая разница в производительности между find и find2perl
  • команда wrapper для sshd_config?
  • 8 Solutions collect form web for “Как rsync файлы между двумя пультами?”

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

    Вместо

     rsync -vuar host1:/var/www host2:/var/www 

    вы можете использовать это

     ssh -R localhost:50000:host2:22 host1 'rsync -e "ssh -p 50000" -vuar /var/www localhost:/var/www' 

    Если вам интересно, опция -R устанавливает обратный канал из порта 50000 на хосте 1, который отображает (через локальную машину) на порт 22 на хосте2. Прямого соединения с host1 на host2 нет.

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

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

    ПРЕДУПРЕЖДЕНИЕ: пересылка SSH позволяет хосту использовать ваш SSH-ключ в течение всего времени вашего входа. Хотя они не могут скопировать ваш ключ, они могут войти в другие машины вместе с ним. Убедитесь, что вы понимаете риски и не используете перенаправление агентов для машин, которым вы не доверяете.

    Следующая команда будет использовать пересылку агента SSH для открытия прямого соединения с host1 на host2 . Это имеет то преимущество, что машина, выполняющая команду, не является узким местом передачи.

     ssh -A host1 rsync -vuar /var/www host2:/var/www 

    Мне нравится ответ roaima, но пути одинаковы в обоих примерах, скрывая то, что есть. Мы установили, что следующее не работает:

     rsync -vuar host1:/host1/path host2:/host2/path 

    Но это делает (я опустил явный bind_address localhost из опции -R поскольку это значение по умолчанию):

     ssh -R 50000:host2:22 host1 'rsync -e "ssh -p 50000" -vuar /host1/path localhost:/host2/path' 

    Обратите внимание, что вам нужно будет правильно настроить ssh-ключи между двумя удаленными узлами, с закрытым ключом на host1 и открытым ключом на host2.

    Чтобы отладить соединение, разделите его на две части и добавьте подробный статус:

     localhost$ ssh -v -R 50000:host2:22 host1 

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

     host1$ rsync -e "ssh -p 50000" -vuar /host1/path localhost:/host2/path 

    Идеальный способ – запустить 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 ). Я использую его и считаю полезным.

    Переформатирование ответа roaima в синтаксисе скрипта bash (и добавление символов продолжения строки '' для ясности) Я случайно выбрал порт 22000 …

     SOURCE_USER=user1 SOURCE_HOST=hostname1 SOURCE_PATH=path1 TARGET_USER=user2 TARGET_HOST=host2 TARGET_PATH=path2 ssh -l $TARGET_USER -A -R localhost:22000:$TARGET_HOST:22 \ $SOURCE_USER@$SOURCE_HOST "rsync -e 'ssh -p 22000' -vuar $SOURCE_PATH \ $TARGET_USER@localhost:$TARGET_PATH" 

    Также как дополнительная информация:

    Если вы используете хост-переходник для подключения двух других машин, но они не могут связаться друг с другом напрямую, вы можете использовать sshfs как среду между этими двумя машинами, как это (на хосте перехода):

     $ mkdir ~/sourcepath ~/destpath $ sshfs sourcehost:/target/dir ~/sourcepath $ sshfs desthost:/target/dir ~/destpath $ rsync -vua ~/sourcepath ~/desthpath 

    SSHFS предоставляет два пути на хосте перехода, а rsync управляет синхронизацией файлов, как всегда (только с той разницей, что это практически выполняется локально).

    Вы можете запустить rsyncd (сервер) на одном из компьютеров.

    Это подход, который я принимаю, поскольку я не хочу использовать ssh, чтобы позволить «источнику» (в формулировке rsync) получить доступ к «адресату» как root без пароля (как это требуется для использования туннелирования SSH с rsync в скрипт)

    В моем случае я просто настроил сервер rsyncd на конечном компьютере с единственным пользователем, разрешенным на исходном ПК, и использовал rsync со стороны источника.

    Прекрасно работает.

    Для передачи файлов можно использовать tar через ssh :

     ssh -n user1@host1 'tar jcf - -C /var/www .' | ssh user2@host2 'tar jxvf - -C /var/www' 

    Измените параметр j (для tar ) на z в двух местах, если вы хотите сжать архив с помощью gzip вместо bzip2 . Обычно bzip2 имеет более высокое сжатие, чем gzip , но он медленнее, поэтому меняйте его в зависимости от ваших потребностей (см .: bzip2 vs gzip ).

    Связано: Как скопировать между двумя удаленными узлами, используя tar, переданные в SSH с удаленного сервера, когда за брандмауэром?


    В качестве альтернативы (для обеспечения безопасности полосы пропускания из-за прозрачного сжатия) можно использовать sshfs для монтирования удаленной файловой системы как локальной и использовать rsync как обычно, например

     $ sshfs user1@host1:/var/www /mnt $ rsync -vuar /mnt user2@host2:/var/www 
    Linux и Unix - лучшая ОС в мире.