rsync'ing несколько пар {src, dest}

У меня есть удаленный сервер, на котором я развертываю код. В настоящее время я использую scp для загрузки кода, но scp очень медленный, и я хотел бы переключиться на rsync (или что-то еще более эффективное). Узким местом является создание ssh соединения, поэтому я хотел бы свести к минимуму количество подключений, которые я делаю на сервере.

Локально мой процесс сборки выводит каталог out содержащий подкаталоги bin , lib и etc Я подталкиваю подмножество выходных файлов в соответствующие позиции на удаленном сервере.

  • SSH на сервер localhost
  • Команда pdsh не удалась с отключенным соединением
  • Перенос динамического порта ssh и tcpdump показывают открытый текст
  • Разрешить ограниченный скрипт rsync (rrsync) для произвольных каталогов с авторизованными ключами
  • Вопросы об использовании ssh и о том, как они относятся к пользователям
  • управление процессом с другого сеанса
  • Мои команды scp выглядят так:

     scp out/bin/$BINFILES remote:/usr/bin scp out/lib/$LIBFILES remote:/usr/lib scp out/etc/$ETCFILES remote:/etc 

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

     rsync -e ssh -avz out/bin/$BINFILES remote:/usr/bin rsync -e ssh -avz out/lib/$LIBFILES remote:/usr/lib rsync -e ssh -avz out/etc/$ETCFILES remote:/etc 

    который быстрее (сжатие и исключение дубликатов), но все же делает три подключения к удаленному серверу.

    Есть ли способ достичь этих трех копий с помощью одной команды rsync ? Я открыт, например, для того, чтобы поместить все пары {src, dest} во временный файл перед копированием, если это будет работать.

    Я также готов попробовать другой инструмент, но он должен быть доступен для OS X (моя текущая платформа разработки), и он должен предпочтительно поддерживать оптимизацию передачи, такую ​​как rsync .

  • Передача портов ssh без входа в систему
  • Отключение SSH от внутренней сети
  • rsync bash скрипт "не удалось установить"
  • Можете ли вы scp, sftp или rsync, трубу?
  • Синхронизация локального каталога с удаленным каталогом в Linux
  • Как отправить команду SysRq по подключению ssh?
  • One Solution collect form web for “rsync'ing несколько пар {src, dest}”

    Причина, по которой несколько последовательных команд rsync медленны, заключается в том, что установление соединения SSH занимает немного времени. Вы можете решить эту проблему, используя установленный SSH-канал . Настройте общий доступ к совместному подключению , затем откройте главное соединение, используйте свои команды rsync без изменений (обратите внимание, что -e ssh был стандартным с десятилетия или около того) и, наконец, закрыть соединение SSH:

     ssh -Nf remote rsync -avz out/bin/$BINFILES remote:/usr/bin rsync -avz out/lib/$LIBFILES remote:/usr/lib rsync -avz out/etc/$ETCFILES remote:/etc ssh -O exit remote 

    Если вы не можете использовать совместное использование SSH (например, поскольку одна из сторон работает Dropbear или очень старая версия OpenSSH), вы можете установить туннель , но это более громоздко.

    В качестве альтернативы, с небольшой работой, вы можете реорганизовать свою команду rsync в одну, играя с фильтрами rsync и символическими ссылками. Если вы можете перемещать каталоги bin и lib , это довольно просто:

     mkdir out/usr mv out/bin out/lib out/usr/ rsync -avz \ --include='/bin/***' --include='/lib/***' --include='/etc/***' \ --exclude='*' out/ remote:/ 

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

     ln -s "$PWD" out/usr rsync -avz --copy-unsafe-links \ --include='/bin/***' --include='/lib/***' --include='/etc/***' \ --exclude='*' out/ remote:/ 
    Linux и Unix - лучшая ОС в мире.