วิธีการแมปผู้ใช้ / กลุ่มเจ้าของใน rsync โดยพลการ


17

ฉันจำเป็นต้องซิงค์ไดเรกทอรีไปยังเซิร์ฟเวอร์ระยะไกลเพื่อให้ไฟล์ทั้งหมดที่เป็นของผู้ใช้ X และกลุ่ม Y บนเครื่องต้นทาง (ภายในเครื่อง) ถูกแมปกับผู้ใช้ W และกลุ่ม Z บนเครื่องปลายทาง (ระยะไกล) ถ้าเป็นไปได้โดยใช้ ssh เป็นการขนส่ง แต่ถ้าฉันต้องการใช้ rsync daemon ก็ใช้ได้เช่นกัน

มีวิธีทำเช่นนั้นหรือไม่? ฉันกำลังมองหาวิธีสร้างแผนที่ผู้ใช้ / กลุ่มโดยพลการเช่น

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

นี่ควรเป็นกรณีการใช้งานที่ค่อนข้างธรรมดาใช่ไหม เช่นฉันมีไฟล์บนเครื่องคอมพิวเตอร์ของฉันซึ่งชื่อผู้ใช้ของฉันคือ X และฉันจำเป็นต้องอัปโหลดไปยังเว็บเซิร์ฟเวอร์ที่พวกเขาจำเป็นต้องเป็นของผู้ใช้ที่กำหนดซึ่งไม่มีชื่อเดียวกันหรือ UID เดียวกันกับผู้ใช้ของฉันใน คอมพิวเตอร์ส่วนบุคคลของฉัน

ฉันไม่พบในหน้า man ของ rsync ...

LINUX ทั้งบนเครื่องโลคัลและรีโมต (Ubuntu local, centOS remote)

คำสั่งที่ฉันลอง: rsync -avz / path / to / local root@myhost.com: / path / to / remote


1
กรุณาเสมอรวมถึงระบบปฏิบัติการของคุณ การแก้ปัญหามักขึ้นอยู่กับระบบปฏิบัติการที่ใช้ คุณใช้ Windows, Linux, Unix, OSX, BSD หรือไม่ เวอร์ชันไหน
terdon

คำตอบ:


21

Rsync เวอร์ชั่น 3.1.0แนะนำ--usermapและ--groupmapตัวเลือกต่างๆอย่างแม่นยำเพื่อจุดประสงค์นั้น ดูหน้าคน


นี่เป็นเรื่องดีที่จะรู้ มีสถานการณ์กรณีการใช้งานสำหรับสิ่งนี้อย่างแน่นอน ตัวอย่างเช่นฉันมีเซิร์ฟเวอร์ Icinga สองเครื่องและฉันต้องทำการซิงค์ทางเดียวของไฟล์ปรับแต่งจากต้นแบบไปเป็นทาส แต่ไอซิ่งบนตัวต้นแบบนั้นเป็น uid ที่ต่างไปจากไอซิ่งบนตัวทาส ดังนั้นคำแนะนำ rsync จึงสามารถจัดการกับสิ่งนี้ได้
Michael Martinez

หมายเหตุรุ่น: Ubuntu v16.04 มี v3.1.1, CentOS 7 มี v3.1.2 แต่ CentOS 6 มี v3.0.6 มันใช้งานได้ดีสำหรับ distros ใหม่
jimp

4

เวอร์ชันล่าสุด (อย่างน้อย 3.1.1) ของ rsync ช่วยให้คุณระบุ "การเป็นเจ้าของระยะไกล":

--usermap=tom:www-data

เปลี่ยนทอมเป็นเจ้าของ www-data (aka PHP / Nginx) หากคุณใช้ Mac เป็นไคลเอนต์ให้ใช้ชงเพื่ออัปเกรดเป็นเวอร์ชันล่าสุด และบนเซิร์ฟเวอร์ของคุณดาวน์โหลดแหล่งข้อมูลที่เก็บถาวรจากนั้น "ทำ" มัน!


สำหรับฉันมันทำงานเป็น --chown = tom: www-data
Federico Galli

0

หากคุณต้องการเปลี่ยนความเป็นเจ้าของไฟล์เป็นผู้ใช้เองคุณจะต้องรูทบนกล่องปลายทางก่อน

ฉันไม่คิดว่าจะมีคุณสมบัติดังกล่าวที่รวมเข้ากับ rsync แต่คุณสามารถทำให้สำเร็จได้โดยการใช้ a findหลังจากทำ rsync ของคุณ

บางทีคำสั่งเช่นนี้จะใช้เคล็ดลับ: ตัวอย่างเช่นแปลจาก UID 1000 => 505 และ UID 1001 => 700:

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

หากคุณมีผู้ใช้หลายคนคุณอาจลองใช้การวนซ้ำกับการจับคู่ในภาษาที่คุณชอบ

มีความสุข.


ตกลงดังนั้นไม่มีทางที่ rsync จะทำเช่นนั้นได้ น่าประหลาดใจสำหรับฉันมันดูเหมือนความต้องการที่ชัดเจน
matteo

1
@matteo ระมัดระวังถ้าคุณใช้สิ่งนี้ หากมีผู้ใช้ที่มี id 1000 หรือ 1001 บนเครื่องระยะไกลอาจมีไฟล์ที่พวกเขาเป็นเจ้าของถูกต้องตามกฎหมายในสถานที่ห่างไกลและ chowning พวกเขาอาจทำให้เกิดปัญหา
terdon

@terdon จะมีผู้ใช้ที่ไม่มีชื่อบนเครื่องระยะไกลได้อย่างไร (เพราะหาก ID แสดงแทนชื่อเมื่อมีการระบุไฟล์หมายความว่าผู้ใช้ไม่มีชื่อใช่มั้ย)
matteo

1
@matteo no ผู้ใช้ทุกคนมี ID ผู้ใช้และชื่อ ในระบบที่ใช้เดเบียนส่วนใหญ่ (และอาจเป็นอย่างอื่น) ผู้ใช้รายแรกคือผู้ใช้ 1000 ลองใช้idเครื่องของคุณดู ดังนั้นหากคุณใช้ ID เช่นนี้คุณกำลังสมมติว่าไม่มีผู้ใช้ที่มี ID เดียวกันในเครื่องระยะไกลและน่าจะไม่เป็นจริง
terdon

ในกรณีของฉันไม่มีผู้ใช้ที่มี UID 1000 บนเซิร์ฟเวอร์อย่างน้อยก็ไม่มีรายการอยู่ใน / etc / passwd ซึ่งเป็นสิ่งที่ฉันเดาได้เพราะเมื่อฉันแสดงรายการไฟล์ด้วย "ls -la" ไฟล์ที่เป็นของ 1,000 (ซึ่งเป็นผลมาจาก rsync -avz จากเครื่องในเครื่องของฉันที่ผู้ใช้ 1000 คือผู้ใช้เริ่มต้น "teo") ปรากฏขึ้นพร้อมกับ "1,000 "ในฐานะเจ้าของ หากมีผู้ใช้ที่มีรหัสนั้นและชื่อของมันคือพูดว่า "ใครบางคน" จากนั้นเจ้าของไฟล์จะแสดงเป็น "ใครบางคน" ในผลลัพธ์ของ ls ใช่ไหม? อย่างไรก็ตามมันเป็นข้อแม้ที่มีประโยชน์ที่จะนำมาพิจารณาขอบคุณ
matteo

-1

ฉันไม่แน่ใจว่าฉันเข้าใจเพื่อเชื่อมต่อsshคุณต้องให้ชื่อผู้ใช้ ชื่อผู้ใช้นั้นจะเป็นผู้ใช้ W บนเครื่องระยะไกลที่อยู่ในกลุ่ม Z ดังนั้นทุกอย่างจะถูกถ่ายโอนตามที่คุณต้องการ:

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

แก้ไขเพื่อตอบความคิดเห็นของ OP

-aถ้าคุณต้องการที่จะทำเช่นนี้แมปผู้ใช้และไม่สูญเสียการตั้งค่าสิทธิ์ที่ไม่ได้ใช้ ก่อนอื่นให้เรียกใช้ rsync ด้วยmywww@myhost.comเพื่อรับชื่อผู้ใช้ที่ถูกต้อง จากนั้นแทนที่จะเป็น-aสาเหตุให้คุณรักษาความเป็นเจ้าของให้ระบุตัวเลือกด้วยตนเอง จาก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

ดังนั้น-aเปิดใช้งานตัวเลือกทั้งหมดข้างต้น แต่คุณไม่ต้องการสงวนกลุ่มหรือเจ้าของ คำสั่งนี้ควรทำสิ่งที่คุณต้องการ:

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

เนื่องจากคุณเข้าสู่ระบบในขณะนี้mywwwและไม่เก็บข้อมูลเจ้าของ / กลุ่มไว้อีกต่อไปสำเนาที่ทำโดยrsyncจะเป็นของmywwwผู้ใช้


ไม่ฉันทำ rsync -avz / path / to / local root@myhost.com: / path / to / remote คำถามของฉันคือฉันจะรับไฟล์ที่เป็นของผู้ใช้ "x" บนเครื่องท้องถิ่นของฉันที่จะแมปกับผู้ใช้ "w" บนเซิร์ฟเวอร์ได้อย่างไร? ในคอมพิวเตอร์ของฉันไฟล์ของฉันเป็นของ "teo" บนเซิร์ฟเวอร์ไม่มีแม้แต่ผู้ใช้ที่เรียกว่า "teo" ฉันต้องการให้ผู้ใช้เป็นคนที่ apache ใช้พูดว่า "mywww"; และเหมือนกันสำหรับกลุ่ม โดยค่าเริ่มต้น rsync จะพยายามรักษาเจ้าของเป็น "teo" และเนื่องจากไม่มีผู้ใช้ดังกล่าวจึงจะรักษา UID ส่งผลให้ไฟล์ที่เป็นของผู้ใช้ "1000" ซึ่งเป็นผู้ใช้ที่ไม่มีอยู่บนเซิร์ฟเวอร์
matteo

Btw ในเวลาเดียวกันฉันต้องรักษาสิทธิ์การใช้งานไฟล์ซึ่งมันทำตามตัวเลือก -a แล้ว ฉันหมายความว่าวิธีแก้ปัญหาใด ๆ ที่จะทำให้ฉันสูญเสียความสามารถในการสงวนสิทธิ์การใช้งานไฟล์ (เช่นไฟล์ 777 ยังคงเป็น 777 และ 600 ยังคงเป็น 600) จะไม่ทำอุบาย
Matteo

@matteo นั่นเป็นเพราะ-aช่วยให้เจ้าของอนุรักษ์และตัวเลือกกลุ่ม ดูคำตอบที่อัปเดตของฉัน
terdon

1
@atteo โปรดอธิบายสิ่งที่คุณต้องการจริง ๆ เมื่อคุณถามคำถาม ด้วยวิธีนี้เราไม่ต้องเสียเวลาให้คำตอบที่ไม่สมบูรณ์ ครั้งต่อไปอย่าลืมว่า i) รวมคำสั่งจริงที่คุณใช้ (rsync จะไม่เก็บสิ่งใดไว้เป็นค่าเริ่มต้นการใช้คำสั่ง-aนั้น) ii) อธิบายข้อ จำกัด ทั้งหมดที่คุณมีอย่างชัดเจนคุณเพิ่งพูดถึงผู้ใช้คนเดียว ) พูดถึงระบบปฏิบัติการของคุณ อย่างไรก็ตามวิธีที่จะทำเช่นนี้กับrsyncจะมีการคัดลอกหนึ่งชุดของไฟล์และชุดต่อไปเป็นmywww@remote root@remote
terdon

1
@matteo สิ่งที่ไม่ชัดเจนจริงๆก็คือคุณใช้-aซึ่งรักษาความเป็นเจ้าของไว้ ตัวอย่างที่คุณให้คำแนะนำคุณจำเป็นต้องทำเพื่อผู้ใช้คนเดียวเท่านั้น อย่างไรก็ตามฉันขอแนะนำให้คุณใช้rsyncเพียงแค่สร้างรายการไฟล์ต่าง ๆ ที่คุณต้องการคัดลอกสำหรับผู้ใช้แต่ละคนและรันหลาย rsyncs ที่เชื่อมต่อกับเครื่องระยะไกลด้วยชื่อผู้ใช้ที่เกี่ยวข้อง นั่นจะง่ายขึ้นและปลอดภัยขึ้น
terdon
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.