Передача с помощью Linux ssh и поддерживая полномочия

Я должен передать файлы через ssh к другому серверу. Файловые структуры идентичны с обеих сторон. Я использовал scp-r, но это не сохраняет orginal полномочия файла/dir. rsync делает задание хранения полномочий в такте, но не удаляет файлы на целевой стороне, если я хочу перезаписать их из-за изменений. Я знаю, что rsync запишет изменения, когда исходные файлы будут более новыми, но мне нужен он, чтобы просто скопировать все независимо даты (т.е. заменять целевой каталог тем, который я перемещаю), не имея необходимость окружать в место назначения сначала и вручную удалять dir.

Я слышал, что tar может сделать это, но я, может казаться, не заставляю его работать без ошибок. Синтаксис

tar -cf - /directory/directory | ssh host.name tar -xf - C /destination_directory

Любая справка ценилась бы.

2
задан 09.12.2010, 22:08

2 ответа

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

Выборки из http://www.samba.org/ftp/rsync/rsync.html:

- W, - целый файл С этим алгоритмом передачи дельты rsync's опции не используется, и целый файл отправляется как есть вместо этого. Передача может быть быстрее, если эта опция используется, когда пропускная способность между источником и целевыми машинами выше, чем пропускная способность к диску (особенно, когда "диск" является на самом деле сетевой файловой системой). Это - значение по умолчанию, когда и источник и место назначения указаны как локальные пути, но только если никакая пишущая пакет опция не в действительности.

- удалите Это говорит rsync удалять посторонние файлы из стороны получения (которые не находятся на передающей стороне), но только для каталогов, которые синхронизируются. Вы, должно быть, попросили, чтобы rsync отправил целый каталог (например, "dir" или "dir /"), не используя подстановочный знак для содержания каталога (например, "dir /*"), так как подстановочный знак расширен оболочкой, и rsync таким образом заставляет запрос передавать отдельные файлы, не родительский каталог файлов. Файлы, которые исключены из передачи, также исключены из того, чтобы быть удаленным, если Вы не используете - удаляют - исключенная опция или отмечают правила как только соответствие на передающей стороне (см. включать/исключать модификаторы в разделе FILTER RULES).

2
ответ дан 09.01.2020, 03:30

Поскольку Eddie указал, rsync --delete -Ha сделает задание для Вас. Удостоверьтесь, что использовали --dry-run/-n опция перед фактическим выполнением его, чтобы не случайно удалять все в неправильном каталоге. Rsync интерпретирует Ваши каталоги по-другому в зависимости от того, добавляете ли Вы запаздывающую наклонную черту (см. man rsync и поиск "запаздывания"), таким образом, легко понять вещи превратно, если Вы не обращаете внимание.

Я также иногда использую tar как, Вы делаете. Я думаю, что Вы просто пропускаете тире перед C в Вашей команде выше. Как показывает опыт, можно только опустить тире в первом параметре. (Но Вы могли также использовать cd вместо неловкого -C синтаксис.) С tar на Вашей исходной стороне Вы создаете дополнительное продвижение directory/ в путях в Вашем архиве, таким образом, я был бы cd сначала на исходной стороне также. -f - избыточно между прочим (tar использует stdin/stdout по умолчанию). Таким образом, вот то, на что мои переданные по каналу смолы имеют тенденцию быть похожими:

cd /some/dir; tar c my_dir | ssh host 'cd /the/target/dir; rm -rf my_dir; tar x'

Использовать sudo tar на стороне хоста для сохранения владения при извлечении. (Подсказка: Использовать cz/xz вместо c/x для передачи gzipped или канала через lzop и lzop -d для сжатия в реальном времени, если Вы передаете по кабелю Ethernet.)

0
ответ дан 09.01.2020, 03:30

Теги

Похожие вопросы