Cách ánh xạ quyền sở hữu người dùng / nhóm tùy ý trong rsync


17

Tôi cần rsync một thư mục đến một máy chủ từ xa để tất cả các tệp thuộc về người dùng X và nhóm Y trên máy nguồn (cục bộ) được ánh xạ tới người dùng W và nhóm Z trên máy đích (từ xa). Nếu có thể bằng cách sử dụng ssh làm phương tiện vận chuyển, nhưng nếu tôi cần sử dụng daemon rsync thì cũng tốt.

Có cách nào làm được việc này không? Tôi đang tìm cách thiết lập bản đồ nhóm / người dùng tùy ý, chẳng hạn như

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

Đây có phải là một trường hợp sử dụng khá phổ biến, phải không? Ví dụ: Tôi có các tệp trên máy tính cục bộ có tên người dùng là X và tôi cần tải chúng lên máy chủ web nơi chúng cần thuộc về một người dùng nhất định không có cùng tên hoặc cùng UID với người dùng của tôi máy tính cá nhân của tôi.

Tôi không thể tìm thấy điều đó trên trang của rsync ...

LINUX trên cả máy cục bộ và máy từ xa (Ubuntu cục bộ, máy từ xa centOS)

Lệnh tôi đã thử: rsync -avz / path / to / local root@myhost.com: / path / to / remote


1
Hãy luôn luôn bao gồm hệ điều hành của bạn. Các giải pháp rất thường phụ thuộc vào Hệ điều hành đang được sử dụng. Bạn đang sử dụng Windows, Linux, Unix, OSX, BSD? Phiên bản nào?
terdon

Câu trả lời:


21

Phiên bản Rsync 3.1.0 đã giới thiệu --usermap--groupmapcác tùy chọn chính xác cho mục đích đó. Xem trang người đàn ông .


Điều này là tốt để biết. Chắc chắn có một kịch bản trường hợp sử dụng cho việc này. Ví dụ: tôi đã có hai máy chủ Icinga và tôi cần thực hiện đồng bộ hóa một chiều các tệp cấu hình từ chủ sang nô lệ. Nhưng icinga trên chủ là một uid khác với icinga trên nô lệ. Vì vậy, tốt để biết rsync có thể xử lý này.
Michael Martinez

Ghi chú phiên bản: Ubuntu v16.04 có v3.1.1, CentOS 7 có v3.1.2, nhưng CentOS 6 có v3.0.6. Điều này làm việc tuyệt vời cho các distro mới hơn.
dong dỏng

4

Phiên bản cuối cùng (ít nhất 3.1.1) của rsync cho phép bạn chỉ định "quyền sở hữu từ xa":

--usermap=tom:www-data

Thay đổi quyền sở hữu tom thành dữ liệu www (còn gọi là PHP / Nginx). Nếu bạn đang sử dụng Mac làm máy khách, hãy sử dụng brew để nâng cấp lên phiên bản cuối cùng. Và trên máy chủ của bạn, tải xuống các nguồn lưu trữ, sau đó "làm" nó!


đối với tôi nó hoạt động như --chown = tom: www-data
Federico Galli

0

Nếu bạn muốn thay đổi quyền sở hữu các tệp thành người dùng tùy ý, trước tiên bạn cần phải root trên hộp đích.

Tôi không nghĩ có một tính năng như vậy được tích hợp bởi rsync, nhưng bạn có thể đạt được nó bằng cách chạy findsau khi thực hiện rsync.

Có thể, một lệnh như thế này sẽ thực hiện thủ thuật: Ví dụ: dịch từ UID 1000 => 505 và UID 1001 => 700:

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

Nếu bạn có nhiều người dùng, bạn có thể cân nhắc sử dụng một vòng lặp với ánh xạ, bằng ngôn ngữ định trước của bạn.

Chúc vui vẻ.


Ok, không có cách nào để rsync làm điều đó. Đáng kinh ngạc, nó dường như là một nhu cầu rõ ràng.
matteo

1
@matteo cẩn thận nếu bạn sử dụng cái này. Nếu có một người dùng có id 1000 hoặc 1001 trên máy từ xa, có thể có các tệp thuộc sở hữu hợp pháp của họ ở các vị trí xa và việc sử dụng chúng có thể gây ra sự cố.
terdon

@terdon làm thế nào để có một người dùng không có tên trên máy từ xa? (bởi vì nếu ID được hiển thị thay vì tên khi các tệp được liệt kê, điều đó có nghĩa là người dùng không có tên, phải không?)
matteo

1
@matteo không, mỗi người dùng đều có id người dùng cũng như tên. Trong hầu hết các hệ thống dựa trên Debian (và có thể là các hệ thống khác), người dùng mặc định đầu tiên là người dùng 1000. Hãy thử chạy idtrên máy của bạn để xem. Do đó, nếu bạn sử dụng ID như thế này, bạn sẽ cho rằng không có người dùng nào có cùng ID trên máy từ xa và điều đó có thể không đúng.
terdon

trong trường hợp của tôi không có người dùng nào có UID 1000 trên máy chủ, ít nhất nó không được liệt kê trong / etc / passwd. Đó là những gì tôi đoán vì khi tôi liệt kê các tệp có "ls -la", các tệp thuộc 1000 (là kết quả của rsync -avz từ máy cục bộ của tôi nơi người dùng 1000 là người dùng mặc định của tôi "teo") hiển thị với "1000 "Là chủ sở hữu. Nếu có một người dùng có id đó và tên của nó là "Ai đó", thì chủ sở hữu của các tệp sẽ được hiển thị là "Ai đó" trong đầu ra của ls, phải không? Dù sao đó là một cảnh báo hữu ích để đưa vào tài khoản, cảm ơn.
matteo

-1

Tôi không chắc chắn tôi hiểu, để kết nối qua sshbạn cần cung cấp tên người dùng. Tên người dùng đó sẽ là người dùng W trên máy từ xa thuộc nhóm Z. Do đó, mọi thứ sẽ được chuyển chính xác như bạn muốn:

rsync /path/to/local userX@remote.com/path/to/remote

EDIT để trả lời cho nhận xét của OP.

Nếu bạn muốn thực hiện ánh xạ người dùng này và không mất cài đặt quyền, đừng sử dụng -a. Đầu tiên, chạy rsync với mywww@myhost.comđể có được tên người dùng phù hợp. Sau đó, thay vì -ađiều đó sẽ khiến bạn giữ quyền sở hữu, hãy chỉ định các tùy chọn theo cách thủ công. Từ 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

Vì vậy, -akích hoạt tất cả các tùy chọn trên nhưng bạn không muốn duy trì nhóm hoặc chủ sở hữu. Lệnh này sẽ làm những gì bạn muốn:

rsync -rlptDvz /path/to/local mywww@myhost.com:/path/to/remote

Vì bạn hiện đang đăng nhập mywwwvà không còn lưu giữ thông tin chủ sở hữu / nhóm, các bản sao được tạo bởi rsyncsẽ thuộc về mywwwngười dùng.


Không, tôi thực hiện rsync -avz / path / to / local root@myhost.com: / path / to / remote. Câu hỏi của tôi là, làm cách nào để các tệp thuộc về người dùng "x" trên máy cục bộ của tôi được ánh xạ lại cho người dùng "w" trên máy chủ? Trên máy tính của tôi, các tập tin của tôi thuộc về "teo". Trên máy chủ thậm chí không có người dùng nào gọi là "teo", tôi cần người dùng là người mà apache sử dụng, nói "mywww"; và tương tự cho nhóm. Theo mặc định, rsync sẽ cố gắng duy trì chủ sở hữu là "teo" và vì không có người dùng như vậy, nên nó sẽ bảo vệ UID, dẫn đến các tệp thuộc về người dùng "1000", là người dùng chưa có trên máy chủ
matteo

Btw, đồng thời tôi cần duy trì các quyền của tập tin mà nó đã làm theo tùy chọn -a. Ý tôi là, bất kỳ giải pháp nào sẽ khiến tôi mất khả năng bảo vệ quyền của tệp (ví dụ: tệp 777 vẫn là 777 và 600 vẫn là 600) sẽ không thực hiện được
matteo

@matteo đó là vì -acho phép chủ sở hữu và tùy chọn nhóm bảo tồn. Xem câu trả lời cập nhật của tôi.
terdon

1
@matteo hãy giải thích những gì bạn thực sự cần khi bạn đặt câu hỏi. Bằng cách đó, chúng tôi không lãng phí thời gian để cung cấp câu trả lời không đầy đủ. Lần tới, hãy nhớ i) bao gồm các lệnh thực tế bạn đã sử dụng (rsync không bảo vệ bất cứ điều gì theo mặc định, việc bạn sử dụng -ađã làm) ii) giải thích rõ ràng tất cả các ràng buộc mà bạn có, bạn chỉ đề cập đến một người dùng cho đến khi nhận xét cuối cùng và iii ) đề cập đến hệ điều hành của bạn. Dù sao, cách để làm điều này rsyncsẽ là sao chép một bộ tệp như mywww@remotevà bộ tiếp theo là root@remote.
terdon

1
@matteo điều thực sự không rõ ràng là bạn đang sử dụng -acái gì để duy trì quyền sở hữu. Các ví dụ bạn đưa ra gợi ý bạn chỉ cần làm điều này cho một người dùng. Dù sao, tôi khuyên bạn nên sử dụng rsync, chỉ cần tạo một danh sách các tệp khác nhau mà bạn muốn sao chép cho mỗi người dùng và chạy nhiều rsyncs kết nối với máy từ xa với tên người dùng có liên quan. Điều đó sẽ đơn giản và an toàn hơn.
terdon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.