Cara memetakan kepemilikan pengguna / grup secara sewenang-wenang di rsync

17

Saya perlu rsync direktori ke server jauh sehingga semua file milik pengguna X dan grup Y pada mesin sumber (lokal) dipetakan ke pengguna W dan grup Z pada mesin tujuan (jarak jauh). Jika memungkinkan dengan menggunakan ssh sebagai transport, tetapi jika saya perlu menggunakan daemon rsync tidak masalah juga.

Apakah ada cara untuk melakukan itu? Saya mencari cara untuk membuat peta pengguna / grup yang sewenang-wenang, seperti

local user X => remote user W
local group Y => remote group Z
... and as many of these as needed.

Ini seharusnya kasus penggunaan yang cukup umum, bukan? Misalnya saya memiliki file di komputer lokal saya di mana nama pengguna saya adalah X, dan saya perlu mengunggahnya ke server web di mana mereka harus milik pengguna yang diberikan yang tidak memiliki nama yang sama atau UID yang sama dengan pengguna saya di komputer pribadi saya.

Saya tidak dapat menemukan itu di halaman manual rsync ...

LINUX pada mesin lokal dan jarak jauh (Ubuntu local, centOS remote)

Perintah yang saya coba: rsync -avz / path / ke / local [email protected]: / path / ke / remote

matteo
sumber
1
Harap selalu sertakan OS Anda. Solusi sangat sering bergantung pada Sistem Operasi yang digunakan. Apakah Anda menggunakan Windows, Linux, Unix, OSX, BSD? Versi yang mana?
terdon

Jawaban:

21

Rsync versi 3.1.0 memperkenalkan --usermapdan --groupmapopsi tepat untuk tujuan itu. Lihat halaman manual .

Michel Schinz
sumber
Ini bagus untuk diketahui. Pasti ada skenario kasus penggunaan untuk ini. Sebagai contoh, saya punya dua server Icinga dan saya perlu melakukan sinkronisasi satu arah dari file konfigurasi dari master ke slave. Tapi icinga pada master berbeda dengan icinga pada slave. Jadi, baik untuk mengetahui rsync dapat menangani ini.
Michael Martinez
Catatan versi: Ubuntu v16.04 memiliki v3.1.1, CentOS 7 memiliki v3.1.2, tetapi CentOS 6 memiliki v3.0.6. Ini berfungsi baik untuk distro yang lebih baru.
Lelucon
4

Versi terakhir (setidaknya 3.1.1) dari rsync memungkinkan Anda menentukan "kepemilikan jarak jauh":

--usermap=tom:www-data

Mengubah kepemilikan tom ke data-www (alias PHP / Nginx). Jika Anda menggunakan Mac sebagai klien, gunakan minuman untuk meningkatkan ke versi terakhir. Dan di server Anda, unduh sumber arsip, lalu "buat" itu!

Thomas Decaux
sumber
bagi saya ini berfungsi sebagai --chown = tom: www-data
Federico Galli
0

Jika Anda ingin mengubah kepemilikan file menjadi pengguna yang sewenang-wenang, Anda harus terlebih dahulu melakukan root pada kotak tujuan.

Saya tidak berpikir ada fitur seperti itu yang diintegrasikan oleh rsync, tetapi Anda dapat mencapainya dengan menjalankan findsetelah melakukan rsync Anda.

Mungkin, perintah seperti ini akan melakukan trik: Misalnya, terjemahkan dari UID 1000 => 505 dan UID 1001 => 700:

find /your/rsynced/path -user 1000 -exec chown 505 {} \;
find /your/rsynced/path -user 1001 -exec chown 700 {} \;

Jika Anda memiliki banyak pengguna, Anda dapat mempertimbangkan menggunakan loop dengan pemetaan, dalam bahasa predileksi Anda.

Selamat bersenang-senang.

Adrien M.
sumber
Ok jadi tidak ada cara agar rsync melakukan itu. Mengagetkan, bagi saya tampaknya ini kebutuhan yang jelas.
matteo
1
@ Matteo hati-hati jika Anda menggunakan ini. Jika ada pengguna dengan id 1000 atau 1001 pada mesin remote mungkin ada file yang secara sah dimiliki oleh mereka di lokasi terpencil dan mengunyahnya dapat menyebabkan masalah.
terdon
@terdon bagaimana akan ada pengguna tanpa nama di mesin remote? (karena jika ID ditampilkan sebagai ganti nama saat file terdaftar, itu berarti pengguna tidak memiliki nama, bukan?)
matteo
1
@matteo no, setiap pengguna memiliki id pengguna dan juga nama. Di sebagian besar sistem berbasis Debian (dan mungkin yang lain) yang pertama, pengguna default adalah pengguna 1000. Coba jalankan iddi mesin Anda untuk melihatnya. Oleh karena itu, jika Anda menggunakan ID seperti ini, Anda mengasumsikan bahwa tidak ada pengguna dengan ID yang sama pada mesin jarak jauh dan itu kemungkinan tidak benar.
terdon
dalam kasus saya tidak ada pengguna dengan UID 1000 di server, setidaknya tidak terdaftar di / etc / passwd. Yang saya duga karena ketika saya daftar file dengan "ls -la", file milik 1000 (yang merupakan hasil rsync -avz dari mesin lokal saya di mana pengguna 1000 adalah pengguna default saya "teo") muncul dengan "1000 "sebagai pemilik. Jika ada pengguna dengan id itu, dan namanya adalah, katakan "Seseorang", maka pemilik file akan ditampilkan sebagai "Seseorang" di output ls, kan? Pokoknya itu peringatan berguna untuk memperhitungkan, terima kasih.
matteo
-1

Saya tidak yakin saya mengerti, untuk terhubung sshAnda perlu memberikan nama pengguna. Nama pengguna itu akan menjadi pengguna W pada mesin jarak jauh yang milik grup Z. Oleh karena itu, semuanya akan ditransfer persis seperti yang Anda inginkan:

rsync /path/to/local [email protected]/path/to/remote

EDIT sebagai jawaban atas komentar OP.

Jika Anda ingin melakukan pemetaan pengguna ini dan tidak kehilangan pengaturan izin, jangan gunakan -a. Pertama, jalankan rsync dengan [email protected]untuk mendapatkan nama pengguna yang tepat. Kemudian, alih-alih -ayang akan menyebabkan Anda mempertahankan kepemilikan, tentukan opsi secara manual. Dari man rsync:

    -a, --archive               archive mode; equals -rlptgoD (no -H,-A,-X)
    -r, --recursive             recurse into directories
    -l, --links                 copy symlinks as symlinks
    -p, --perms                 preserve permissions
    -t, --times                 preserve modification times
    -g, --group                 preserve group
    -o, --owner                 preserve owner (super-user only)
    -D                          same as --devices --specials

Jadi, -aaktifkan semua opsi di atas tetapi Anda tidak ingin mempertahankan grup atau pemiliknya. Perintah ini harus melakukan apa yang Anda inginkan:

rsync -rlptDvz /path/to/local [email protected]:/path/to/remote

Karena Anda sekarang masuk sebagai mywwwdan tidak lagi menyimpan informasi pemilik / grup, salinan yang dibuat oleh rsyncakan menjadi milik mywwwpengguna.

terdon
sumber
Tidak, saya melakukan rsync -avz / path / ke / local [email protected]: / path / ke / remote. Pertanyaan saya adalah, bagaimana cara mendapatkan file milik pengguna "x" pada mesin lokal saya untuk dipetakan kembali ke pengguna "w" di server? Di komputer saya, file saya milik "teo". Di server bahkan tidak ada pengguna yang disebut "teo", saya perlu pengguna untuk menjadi orang yang menggunakan apache, katakan "mywww"; dan sama untuk grup. Secara default, rsync akan mencoba untuk mempertahankan pemilik sebagai "teo", dan karena tidak ada pengguna seperti itu, itu akan mempertahankan UID, menghasilkan file milik pengguna "1000" yang merupakan pengguna yang tidak ada di server
matteo
Btw, pada saat yang sama saya perlu mempertahankan izin file yang sudah dilakukannya sesuai opsi -a. Maksud saya, solusi apa pun yang akan membuat saya kehilangan kemampuan untuk mempertahankan izin file (yaitu file 777 tetap menjadi 777 dan 600 tetap menjadi 600) tidak akan melakukan trik
matteo
@matteo itu karena -amemungkinkan untuk mempertahankan opsi pemilik dan grup. Lihat jawaban saya yang diperbarui.
terdon
1
@matteo tolong jelaskan apa yang sebenarnya Anda butuhkan saat mengajukan pertanyaan. Dengan begitu kita tidak membuang waktu untuk memberikan jawaban yang tidak lengkap. Lain kali, ingat untuk i) termasuk perintah aktual yang Anda gunakan (rsync tidak mempertahankan apa pun secara default, penggunaan Anda -amelakukan itu) ii) jelas menjelaskan semua kendala yang Anda miliki, Anda hanya menyebutkan satu pengguna sampai komentar terakhir Anda dan iii ) sebutkan OS Anda. Bagaimanapun, cara untuk melakukan ini adalah dengan rsyncmenyalin satu set file sebagai mywww@remotedan set berikutnya sebagai root@remote.
terdon
1
@matteo yang sebenarnya tidak jelas adalah bahwa Anda menggunakan -ayang mempertahankan kepemilikan. Contoh yang Anda berikan menyarankan Anda hanya perlu melakukan ini untuk satu pengguna. Bagaimanapun, saya akan merekomendasikan Anda gunakan rsync, cukup buat daftar file berbeda yang ingin Anda salin untuk setiap pengguna dan jalankan beberapa rsyncs yang terhubung ke mesin jarak jauh dengan nama pengguna yang relevan. Itu akan lebih sederhana dan lebih aman.
terdon