ฉันจะเปลี่ยนไฟล์ทั้งหมดที่เป็นของผู้ใช้รายหนึ่งเป็นผู้ใช้รายอื่นได้อย่างไร


39

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

คำสั่งในฝันของฉันจะมีลักษณะเช่นนี้ ...

chuser -R --olduser tom --newuser jerry

หรือ

chuser -R --olduser 1066 --newuser 1492

นี่คือสถานการณ์ของฉัน ... ฉันมีไฟล์สำรอง (.tgz) ที่เก็บข้อมูลผู้ใช้และกลุ่มไว้ มันถูกนำมาจากเว็บเซิร์ฟเวอร์ที่ใช้ Apache และ MySQL ไฟล์ในการสำรองข้อมูลมาจากทั่วทั้งระบบและมีไฟล์จากผู้ใช้หลายรายและบัญชีประเภทระบบหลายระบบและเป็นกุญแจสำคัญที่เมื่อทำการกู้คืนบนเซิร์ฟเวอร์ใหม่การตั้งค่าจะไม่สูญหาย ปัญหาคือผู้ใช้ในเครื่องไฟล์ที่ถูกกู้คืนไม่ตรงกับไฟล์ในไฟล์สำรอง เช่นเครื่องทั้งสองมีผู้ใช้ MySQL แต่มีรหัสผู้ใช้ที่แตกต่างกันและมีรหัสผู้ใช้หลายตัวที่มีอยู่ในเครื่องทั้งสองที่เป็นของผู้ใช้ที่แตกต่างกัน ซึ่งหมายความว่าไม่มีวิธีการซิงค์ผู้ใช้บนเครื่องใหม่กับผู้ใช้บนเครื่องเก่า

ฉันสามารถค้นหาไฟล์ผู้ใช้ทั้งหมดด้วยคำสั่ง find เช่นนี้ ...

find /decompressed-backup-dir -uid 1050

หรือ

find /decompressed-backup-dir -user tom

ถ้าอย่างที่ฉันสงสัยไม่มีวิธีที่จะทำสิ่งที่ฉันต้องการด้วยคำสั่งเดียวแล้วบางทีอาจมีวิธีที่จะไพเราะผลลัพธ์ของคำสั่ง find ไปยังคำสั่งอื่นเพื่อจัดการกับการเปลี่ยนแปลงความเป็นเจ้าของ?

ฉันสามารถทำได้ด้วยสคริปต์ PHP แต่มี 4GB และหมื่นไฟล์ในการสำรองข้อมูลดังนั้นฉันไม่ต้องการใช้ PHP หรือ Perl แต่ฉันจะมีความสุขกับเชลล์สคริปต์ที่สามารถจัดการได้

คำตอบ:



65

ฉันคิดว่าธง --from ในคำสั่ง chown อาจเป็นวิธีที่ง่ายที่สุด

chown --from=oldguy newguy * -R

3
ทางออกที่ดีที่สุดไม่จำเป็นต้องพบรักเลย
Tobias Hagenbeek

2
ทางออกที่ดีที่สุด
Karl Forner

1
ใน OS X คุณสามารถทำเช่นนี้กับและbrew install coreutils gchown
jomo

นี่คือคำตอบที่ถูกต้องและดีที่สุด
George M

ฉันยืนยันว่าควรทำเครื่องหมายเป็นคำตอบที่ดีที่สุด
Soullivaneuh

7

การเพิ่มคำตอบโดย SiteKickr , chgrpไม่ได้มี--fromการโต้แย้ง แต่คุณจะประสบความสำเร็จเช่นเดียวกันกับchownโดยเลี่ยงการใช้

ตัวอย่าง:

chown -R --from=:currentgroup :newgroup /some/directory

6

คุณสามารถใช้เป็นบางส่วนใครโพสต์ที่จะทำ findchown

อย่างไรก็ตามคุณอาจไม่จำเป็นtarต้องดูแลสิ่งต่าง ๆ ให้คุณ

ตัวอย่างเช่นถ้าคุณทำtarในmachine Aที่ผู้ใช้tomเป็นuid 500แล้วuntarไฟล์บนmachine Bที่ผู้ใช้tomเป็นuid 505, จะทำสิ่งที่ถูกต้องและทำให้ไฟล์ที่เป็นเจ้าของโดยtaruid 505


อาหารอันโอชะที่น่าสนใจฉันไม่ได้ตระหนักถึงเรื่องนี้ ดังนั้น tar ไม่เพียง แต่เก็บ uid เท่านั้น แต่ยังรวมถึงชื่อที่เกี่ยวข้องกับ uid ด้วย
Nicholi

3
รูปแบบ tar ดั้งเดิมเก็บข้อมูลที่เป็นตัวเลขเท่านั้น รูปแบบ UStar ซึ่งนำเสนอโดย POSIX ในช่วงปลายยุค 80 เพิ่มชื่อ น้ำมันดินที่คุณพบเจอในทุกวันนี้ทำในสิ่งที่ถูกต้อง
Ciclamino

1

คำตอบชุดทั้งผู้ใช้และกลุ่ม:

find /decompressed-backup-dir -uid 1050 -exec chown newuser:newgroup {} +

แต่ถ้าคุณต้องการเปลี่ยนเฉพาะกลุ่มไฟล์ที่เป็นของผู้ใช้บางคนคุณไม่สามารถใช้chown(เท่าที่ฉันรู้) แต่ใช้chgrp:

find /decompressed-backup-dir -uid 1050 -exec chgrp newgroup {} +

และเปลี่ยนเฉพาะกลุ่มไฟล์ที่เป็นของกลุ่มบางกลุ่มที่คุณต้องใช้เช่น:

find /decompressed-backup-dir -gid 400 -exec chgrp newgroup {} +

เพียงเพื่อเพิ่มความรู้


1
จริงๆแล้วคุณสามารถละnewuserส่วนไปได้ หน้าคนพูดว่า: "ถ้าได้รับโคลอนและกลุ่ม แต่ไม่ได้ระบุเจ้าของจะมีการเปลี่ยนแปลงเฉพาะกลุ่มของไฟล์ในกรณีนี้ให้chownทำหน้าที่เหมือนกับchgrp"
Ben Voigt

0

หากคุณจำเป็นต้องซ้ำแผนที่ / รหัสเจ้าของเก่าใหม่ที่มีมติให้เดียวกัน/etc/passwdผู้ใช้ ,

(ซึ่งอาจเกิดขึ้นหลังจากที่คุณได้แนะนำ LDAP เข้าสู่เซิร์ฟเวอร์และ/etc/passwdมีรายการที่ซ้ำกันสำหรับผู้ใช้และกลุ่มแต่ละคน)

คุณสามารถใช้สคริปต์นี้ฉันเขียนว่า: https://gist.github.com/siers/ded0a4158c900495f04c3ad965f4a544

มันสร้างการทำแผนที่ด้วยตัวเอง โชคไม่ดีที่อินเทอร์เฟซของโปรแกรมอยู่ในรหัส เพิ่มคำสั่ง debug บางส่วนหากคุณต้องการตรวจสอบว่ามันทำอะไรได้บ้าง แต่มันสวยมากchown /etc/passwdสรรเสริญกับการทำแผนที่ที่สร้างขึ้นจากที่ซ้ำกันใน ถ้ามันมีประโยชน์กับทุกคนมันจะเจ๋งจริงๆ :)


-2

คุณสามารถใช้ได้ chown - R /directory/file

คำสั่งนี้จะเปลี่ยนการอนุญาตสำหรับอินสแตนซ์ทั้งหมดของไดเรกทอรี chown - R /directory

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.