rsync und Schreibberechtigungen am Ziel

8

Ich habe mich immer gefragt, warum rsyncversucht wird, eine Datei an einen Remotestandort zu übertragen, an dem sie Lese- / Ausführungsberechtigungen für das Zielverzeichnis hat, aber keine Schreibberechtigungen zum Erstellen der eigentlichen Zieldatei . Dies kann sogar lokal simuliert werden, wenn versucht wird, eine Datei als normaler Benutzer nach / zu kopieren , rsyncdie gesamte Datei überträgt (was auch bei großen Dateien ziemlich lange dauert) und schließlich mit fehlschlägt

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

So scheint es , schon beim Start zum Scheitern verurteilt , wenn man versucht , die temporäre Datei (die erstellen Punkt -datei) während der Übertragung. Warum merkt es das nicht und bricht es früh ab, anstatt zu versuchen, die gesamte Datei ohne Schreibberechtigung zu kopieren?

Und wohin wird die Datei kopiert, wenn die temporäre Datei nicht erstellt werden kann? Ich kann keine Speichererhöhung der rsync-Prozesse und auch keine entsprechende Datei in / tmp sehen . Scheint, als würde es die Daten am Ziel direkt verwerfen, aber die Übertragung fortsetzen.

scai
quelle

Antworten:

5

Wenn Sie ohne Schreibberechtigung in ein Verzeichnis kopieren müssen, fügen Sie --inplaceden Befehlsoptionen hinzu. Dies ist manchmal billiger, als keine temporäre Kopie zu erstellen, aber während des Aktualisierens befindet sich die Datei in einem inkonsistenten Zustand.

Auf die Frage, warum die eigenen Rechte nicht im Voraus überprüft werden: Es könnten einige zusätzliche Details als ACLs mit erweitertem Zugriff fehlen, sodass rsync nicht an das Standardschema 3 * 3 + 3 glaubt. OTOH diese absichtliche Richtlinie macht keinen wirklichen Unterschied im Ergebnis - trotzdem wird die Datei nicht aktualisiert.

Netch
quelle
Vielen Dank für Ihre Antwort, aber das ist nur eine vage Vermutung und beantwortet meine Frage nicht wirklich. Trotzdem --inplacewird die gesamte Datei übertragen, bis der Mangel an Schreibberechtigungen festgestellt wird.
Scai
1
Dies beantwortet zwar nicht die Hilfe von OP, die Verwendung --inplaceist jedoch sehr nützlich, wenn Sie Rechte zum Schreiben in eine Datei haben, jedoch nicht in das enthaltende Verzeichnis.
Tokand
aber das war meine lösung (ich hatte tmp-
dateien
4

Dies scheint ein Mangel des aktuellen rsync-Protokolls zu sein, wie im Bug-Tracker erläutert . Das rsync-Protokoll kann nicht im Voraus feststellen, ob es Schreibberechtigungen für das Ziel hat. Stattdessen sendet es nur und prüft anschließend auf Erfolg oder Misserfolg.

scai
quelle
2

Rsync erstellt eine temporäre Datei im selben Ordner wie die Zieldatei. In diesem Fall müssen Sie einige Dateien kopieren /, da Sie sie nicht als root gestartet haben und normalerweise /nur von root beschreibbar waren. Daher schlägt dies fehl.

Um herauszufinden, welche Dateien kopiert werden, übergeben Sie den Parameter -v

Gänseblümchen
quelle
1
Ich weiß, dass rsyncdie temporären Dateien im selben Ordner wie das Zielverzeichnis erstellt werden. Aber selbst wenn es diese temporären Dateien nicht erstellen kann, startet es die Übertragung und schlägt danach fehl, anstatt gleich zu Beginn zu prüfen, ob alle erforderlichen Schreibberechtigungen vorhanden sind. Ich möchte wissen, warum es sich so verhält.
Scai