Rsync и разрешения на запись в целевой

8

Я всегда задавался вопросом, почему rsyncпытается передать файл в удаленное местоположение, где у него есть разрешения на чтение / выполнение для целевого каталога, но нет прав на запись для создания фактического файла назначения. Это может быть смоделировано даже локально, когда вы пытаетесь скопировать файл как обычный пользователь в / , rsyncпередаст весь файл (также довольно долго для больших файлов) и, наконец, завершится неудачно с

rsync: mkstemp "/.myTargetFile" failed: Permission denied (13)

Таким образом, кажется, что он уже не работает при запуске при попытке создать временный файл ( точка- файл ) во время передачи. Почему он не замечает этого и прерывает работу раньше, вместо того, чтобы пытаться скопировать весь файл без каких-либо разрешений на запись?

И куда он копирует файл, если не может создать временный файл? Я не вижу увеличения памяти процессов rsync, а также нет соответствующего файла в / tmp . Похоже, что он напрямую отбрасывает данные в месте назначения, но продолжает передачу.

SCAI
источник

Ответы:

5

Если вам нужно скопировать в каталог без разрешения на запись, добавьте --inplaceв опции команды. Иногда это дешевле, чем временная копия, но во время обновления файл находится в несогласованном состоянии.

На вопрос, почему он не проверяет свои права заранее: он может пропустить некоторые дополнительные особенности, такие как ACL с расширенным доступом, поэтому rsync не верит в стандартную схему 3 * 3 + 3. OTOH эта намеренная политика не имеет никакого реального значения в результате - в любом случае файл не обновляется.

Netch
источник
Спасибо за ваш ответ, но это лишь смутное предположение, которое не отвечает на мой вопрос. Даже при --inplaceэтом передает весь файл, пока не заметит отсутствие разрешений на запись.
Scai
1
Хотя это не отвечает на помощь OP, использование --inplaceочень полезно, когда у вас есть права на запись в файл, но не на директорию с содержимым.
Tokland
но это было мое решение (у меня были tmp-файлы, сгенерированные, но не переименованные в оригинальное имя), так что спасибо и вверх
roothahn
4

Это, кажется, недостаток текущего протокола rsync, как объяснено в трекере ошибок . Протокол rsync не может заранее определить, есть ли у него разрешения на запись для цели. Вместо этого он просто отправляет и проверяет успех или неудачу впоследствии.

SCAI
источник
2

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

Чтобы узнать, какие файлы копируются, передайте параметр -v

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