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

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

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

Мои команды 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 .

  • git не использует глобальный файл конфигурации или открытый ключ
  • Можно ли загружать чрезвычайно большие файлы разумно или по частям через SSH от Linux до Windows?
  • SFTP для поиска малины Pi
  • ssh возвращает сообщение «Ошибка пересылки X11 не удалось на канале 1»
  • Рекомендуемый способ входа в систему root?
  • Дайте пользователю разрешение на одну папку
  • Получить в реальном времени stdout из контейнера докера на удаленно выполненной команде
  • Автоматизированный вход 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 - лучшая ОС в мире.