rsync dan tulis izin pada target

8

Saya selalu bertanya-tanya mengapa rsyncmencoba mentransfer file ke lokasi yang jauh di mana ia telah membaca / mengeksekusi izin untuk direktori target, tetapi tidak ada izin menulis untuk membuat file tujuan yang sebenarnya. Ini dapat disimulasikan bahkan secara lokal ketika mencoba menyalin file sebagai pengguna biasa ke / , rsyncakan mentransfer seluruh file (juga memakan waktu agak lama untuk file besar) dan akhirnya gagal dengan

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

Jadi sepertinya sudah gagal saat startup ketika mencoba membuat file sementara ( dot -file) selama transfer. Mengapa tidak memperhatikan hal ini dan membatalkan lebih awal daripada mencoba menyalin seluruh file tanpa memiliki izin menulis?

Dan di mana itu menyalin file jika tidak dapat membuat file sementara? Saya tidak dapat melihat peningkatan memori dari proses rsync dan juga tidak ada file yang sesuai di / tmp . Sepertinya itu langsung membuang data di tujuan tetapi tetap melanjutkan dengan transfer.

scai
sumber

Jawaban:

5

Jika Anda perlu menyalin ke direktori tanpa izin menulis, tambahkan --inplaceke opsi perintah. Terkadang ini lebih murah karena tidak membuat salinan sementara, tetapi saat memperbarui file dalam kondisi tidak konsisten.

Pada pertanyaan mengapa ia tidak memeriksa hak sendiri sebelumnya: ia dapat melewatkan beberapa spesifikasi tambahan sebagai ACL akses tambahan, jadi rsync tidak percaya pada skema standar 3 * 3 + 3. OTOH kebijakan yang disengaja ini tidak membuat perbedaan nyata dalam hasil - bagaimanapun file tidak diperbarui.

Netch
sumber
Terima kasih atas balasan Anda, tapi itu hanya tebakan yang samar-samar dan tidak benar-benar menjawab pertanyaan saya. Bahkan dengan --inplaceitu mentransfer seluruh file sampai memperhatikan kurangnya izin tulis.
scai
1
Meskipun ini tidak menjawab bantuan OP, menggunakan --inplacesangat berguna ketika Anda memiliki hak untuk menulis ke file tetapi tidak berisi direktori.
tokland
tapi itu solusi saya (saya punya tmp-file yang dihasilkan tetapi tidak diganti namanya menjadi nama originale), jadi terima kasih dan up
roothahn
4

Ini tampaknya merupakan kelemahan dari protokol rsync saat ini seperti yang dijelaskan dalam pelacak bug . Protokol rsync tidak dapat menentukan sebelumnya apakah memiliki izin menulis di target. Alih-alih hanya mengirim dan memeriksa keberhasilan atau kegagalan sesudahnya.

scai
sumber
2

Rsync membuat file sementara pada folder yang sama dari file target, jadi dalam hal ini, Anda harus menyalin beberapa file /, karena Anda tidak meluncurkannya sebagai root, dan biasanya /hanya dapat ditulis oleh root, sehingga gagal.

Untuk mengetahui file apa yang sedang disalin, sampaikan parameternya -v

bunga aster
sumber
1
Saya tahu itu rsyncmembuat file sementara di folder yang sama dengan direktori target. Tetapi bahkan jika itu tidak dapat membuat file-file sementara itu masih memulai transfer dan gagal setelah itu bukannya memeriksa tepat di awal jika itu semua memiliki izin menulis yang diperlukan. Saya ingin tahu mengapa berperilaku seperti itu.
scai