จะส่งต่อไฟล์จากผู้ใช้รายหนึ่งไปยังอีกคนหนึ่งได้อย่างไร (โดยไม่ต้องสร้างสำเนาใด ๆ )


2

สมมติว่าผู้ใช้ "qqq" มีไฟล์ /home/qqq/bigfile.dat และต้องการส่งผ่านไปยังผู้ใช้ "aaa" โดยไม่ต้องใช้ root (ต้องเป็น "aaa") ผู้ใช้ "qqq" และ "aaa" ควรทำอย่างไร

วิธีไร้เดียงสา:

  1. uid=qqq$ mv bigfile.dat /home/aaa/
  2. uid=aaa$ chown aaa /home/aaa/bigfile.dat # Operation not permitted

แน่นอนว่าสามารถทำได้โดยใช้ ACLs ( uid=qqq$ setfacl u:aaa:rw- /home/aaa/bigfile.dat) หรือทำสำเนาชั่วคราว ( uid=aaa$ mv bigfile.dat bigfile.dat_ && cat bigfile.dat_ > bigfile.dat && rm bigfile.dat_) แต่ทั้งสองวิธีดูเหมือนจะมีข้อเสีย

ผู้ใช้ทั้งสองตกลง (สามารถออกคำสั่งบางอย่าง) เพื่อ "ส่ง" ไฟล์ มันควรจะรวดเร็วรักษาไอโหนดและคุณสมบัติอื่น ๆ

จะทำอย่างไรให้หมดจด?


ดูเหมือนว่าคุณจะรู้วิธีให้สิทธิ์การเข้าถึงแบบเต็มไปยังไฟล์ aaa (สิทธิ์ปกติสำหรับกลุ่มและอื่น ๆ ใช้งานได้เช่นกัน) คุณต้องทำอย่างไรจึงจะต้องมีการตั้งค่าเจ้าของไฟล์ที่คุณไม่สามารถทำได้ในตอนนี้

ที่จริงแล้วมันจำเป็นเพราะไม่มีคำตอบที่ดีสำหรับsuperuser.com/questions/152963/slave-user-accounts-in-gnu-linux
Vi

คำตอบ:


1

ระบบ unix เก่าอนุญาตให้ผู้ใช้ใด ๆ chown ไฟล์ของตัวเองไปยังเป้าหมายใด ๆ ส่วนใหญ่ไม่ทำอีกต่อไปเพราะสิ่งนี้สร้างปัญหาความปลอดภัยบางอย่าง:

  • หากมีโควต้าการใช้งานดิสก์อยู่ในสถานที่ผู้ใช้ A สามารถจัดเก็บไฟล์ตามค่าใช้จ่ายของผู้ใช้ B โดยใส่ไว้ในไดเรกทอรีส่วนตัว ผู้ใช้ B จะไม่มีทางรู้ยกเว้นโดยเปรียบเทียบการใช้งานดิสก์ที่มองเห็นกับโควต้าของพวกเขาและจะไม่มีทางหาขโมยโควต้า

  • บางโปรแกรมที่มีสิทธิใช้งาน (ตั้งค่า [ug] id executables หรือ daemons) สมมติว่าหากผู้ใช้เป็นเจ้าของไฟล์ผู้ใช้นั้นได้อนุมัติเนื้อหาแล้ว หากผู้ใช้ A สามารถ chown ไฟล์ให้กับผู้ใช้ B, A อาจหลอกล่อโปรแกรมสิทธิ์ให้ยอมรับข้อมูลใด ๆ (นี่เป็นการออกแบบที่ไม่ปลอดภัยเนื่องจากแม้ว่า A ได้เขียนไฟล์จริงแล้ว A อาจไม่ได้รับการอนุมัติเพื่อวัตถุประสงค์นี้โดยเฉพาะ แต่โปรแกรมดังกล่าวมีอยู่จริงและการห้ามการลงทะเบียน chowns จะลดความเสี่ยงลง)

  • chown โดยผู้ใช้ที่ไม่ใช่รูทไม่สามารถยกเลิกได้ โปรดทราบว่ามันเป็นความเสี่ยงที่คุณอาจมีอยู่ (และที่จริงแล้วมีสิ่งอื่น ๆ ที่คุณสามารถทำได้ในระบบไฟล์ยูนิกซ์ที่สามารถยกเลิกได้หากผู้ใช้รายอื่นร่วมมือกัน)

เท่าที่ฉันรู้มันเป็นไปไม่ได้ที่จะเปลี่ยนความเป็นเจ้าของไฟล์บนระบบยูนิกซ์ที่ทันสมัยส่วนใหญ่โดยไม่ต้องมีความร่วมมือจากรูท รูทสามารถทำการ chown หรือให้สิทธิ์ A หรือ B ผ่าน sudo ได้ แต่นั่นต้องมีการแทรกแซงรูทเป้าหมายมากกว่าที่ต้องการ

หากเปิดใช้งาน ACL ตามที่คุณสังเกตเห็นว่ามีผลในทางปฏิบัติส่วนใหญ่ของการ chowning

หากเวิร์กโฟลว์ต้องการให้ A เป็นเจ้าของในบางจุดและ B เป็นเจ้าของ ณ จุดอื่นมีตัวเลือกอื่นที่คุณสามารถสำรวจได้

  • B อาจใช้fakerootเพื่อรันโปรแกรมและทำให้เชื่อว่ามันทำงานเป็น root ซึ่งอนุญาตให้ chown จำลองที่มีอยู่ในหน่วยความจำของ fakeroot เท่านั้น ( fakeroot sh -c 'chown B file; su B -c program')

  • คุณสามารถเล่นกลกับ FUSE ได้ ตัวอย่างเช่นbindfsให้คุณสร้างมุมมองของแผนผังไดเร็กทอรีที่ไฟล์มีเจ้าของที่แตกต่างกัน ( mkdir view_for_B; bindfs -u B actual_directory view_for_B)


แน่นอนฉันคาดว่าผู้ใช้ทั้งสองจะแสดงข้อตกลงสำหรับการเปลี่ยนแปลงดังกล่าว
วิ

0

คุณสามารถย้ายไฟล์ไปยังพื้นที่ที่แชร์ซึ่งผู้ใช้ทั้งสองมีสิทธิ์ในการเขียน (หรือสิ่งนั้นไม่มีอยู่ใน Linux หรือไม่) แล้วมีเจ้าของ chmod ไปยังผู้รับหรือไม่

ความคิดของฉันมีรากฐานมาจาก Mac OS X ดังนั้นอาจเป็นไปได้หรือไม่เหมาะกับคุณ


มีอยู่บน Linux แต่คุณไม่สามารถ chown เป็นผู้ใช้ทั่วไปได้

0

ขึ้นอยู่กับสิ่งที่คุณหมายถึงโดย "ไม่ช่วยจากราก" หากคุณสามารถรูทเพื่อเพิ่ม aaa และ qqq ให้กับกลุ่มใหม่ (ชื่อใดก็ได้) และให้แน่ใจว่าไฟล์นั้นมี r-- perms อย่างน้อยสำหรับกลุ่มใหม่ ... (สามารถเก็บ rwx สำหรับผู้ใช้ aaa - ดังนั้นคุณ get => aaa: newgroup rw-r -----) จากนั้นโดยไม่มีความช่วยเหลือเพิ่มเติมจากรูต aaa สามารถแก้ไขได้และ qqq สามารถอ่านไฟล์เดียวกันได้

หากคุณต้องการที่จะทำ "กับความปรารถนาของรูต" จากนั้นฉันจะพิจารณาข้อผิดพลาดถ้าคุณพบวิธีที่ทำงานได้ มีความคิดมากมายที่ป้องกันปัญหานี้เนื่องจากเป็นปัญหาด้านความปลอดภัยหาก aaa สามารถทำให้โทรจันเข้าสู่ไดเรกทอรีที่ qqq สามารถเข้าถึงได้และอาจ "บังเอิญ" จากนั้นเรียกใช้


คุณอาจไม่เข้าใจคำถาม ผู้ใช้อยู่ในกลุ่มเดียวกันอยู่แล้ว (ไม่เช่นmv bigfile.dat /home/aaa/นั้นจะล้มเหลวหรือต้องการสิทธิ์การเข้าถึงที่มากเกินไปสำหรับ / home / aaa) คำถามเกี่ยวกับการเปลี่ยนข้อมูลเมตาของไฟล์
วิ

-1

วิธีหนึ่งที่จะทำเช่นนี้จะสร้าง SSH ที่สำคัญซึ่งจะช่วยให้ผู้ใช้QQQที่จะเชื่อมต่อเป็นAAA ในฐานะที่เป็นqqqทำ

ssh-keygen -t rsa

และตัดสินใจว่าคุณต้องการรับรหัสผ่านหรือไม่

จากนั้นเพิ่มคีย์ที่สร้างขึ้นใหม่ไปยังaaaโดยเรียกใช้เป็นqqq :

ssh-copy-id -i ~/.ssh/id_rsa.pub aaa@localhost

หลังจากนั้นคุณสามารถย้ายไฟล์ไปมาในลักษณะนี้:

scp bigfile.dat aaa@localhost:

(หรือกับไคลเอนต์ SFTP ที่คุณชื่นชอบ)

ด้วยวิธีนี้ sshd จะดูแลการเปลี่ยนความเป็นเจ้าของ

การใช้ scp / sftp สำหรับการถ่ายโอนในเครื่องอาจฟังดูแปลก แต่อย่างน้อยก็ใช้ได้! :)


1. ไม่ใช่กรณีเครือข่าย 2. ฉันไม่ต้องการให้มีการสร้างสำเนาไฟล์ สมมติว่าไฟล์คือ 4 GB และที่เก็บข้อมูลทั้งหมดคือ 5 GB
วิ

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