Sudo สร้างตัวแปรสภาพแวดล้อม "SUDO_USER" ที่คุณสามารถใช้เพื่อค้นหาผู้ใช้ที่ลงชื่อเข้าใช้ (ที่จริงแล้วใครคือ Sudo)
สมมติว่าคุณ Sudo เป็นรูท (เป็นไปได้ที่จะใช้ Sudo เพื่อเข้าถึงผู้ใช้รายอื่นด้วย) คุณสามารถเขียนสคริปต์เพื่อทำสองขั้นตอนต่อไปนี้โดยอัตโนมัติ
cp source target
chown $SUDO_USER target
(สิ่งนี้จะไม่ทำงานหากคุณ sudo กับผู้ใช้ที่ไม่ใช่รูทเนื่องจากมีเพียง root เท่านั้นที่สามารถให้ไฟล์ได้)
มันจะทำงานโดยอัตโนมัติ หากซอร์สเป็นไฟล์เดียวและเป้าหมายไม่ใช่ไดเร็กทอรีแสดงว่างานของคุณเสร็จสิ้นแล้ว ฉันคิดว่าคุณถามคำถามเพราะปัญหาเป็นเพียงปัญหาจริงในสถานการณ์ที่ซับซ้อนมากขึ้นเช่นเมื่อทำอะไรเช่น:
cp /path/source/some*files /path/target/directory/
สคริปต์ที่ซับซ้อนเพื่อค้นหาว่าไฟล์ใดและไดเรกทอรีใดบ้างที่ผ่านไปซึ่งไฟล์นั้นมีอยู่ก่อนหน้านั้นไฟล์ใดที่ถูกเขียนทับจริงและเพื่อเปลี่ยนความเป็นเจ้าของไฟล์ที่คัดลอกสำเร็จเท่านั้นที่สามารถเขียนได้
งานนี้เสร็จสิ้นแล้ว คุณสามารถใช้cpio
- หลังจาก sudo to root ใช้ cpio เพื่อคัดลอกไฟล์ cpio ต้องการรายการไฟล์ที่จะคัดลอกดังนั้นจึงเป็นกระบวนการสองขั้นตอน ด้านล่างฉันใช้ls
เพื่อสร้างรายการไฟล์ที่จะคัดลอก
ls /path/source/some*files | cpio -pdm --owner $SUDO_USER /path/target/directory/
-pdm
หมายถึง "โหมด Passthrough, การสร้างไดเรกทอรีตามต้องการรักษาเวลาของการแก้ไขไฟล์"
--owner $SUDO_USER"
ทำให้ผู้ใช้ที่ระบุเป็นเจ้าของไฟล์
ตัวถูกดำเนินการขั้นสุดท้ายคือไดเร็กทอรีที่ cpio ต้องเก็บไฟล์
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับสุดยอดของ cpio ไปที่หน้าคู่มือ CPIO ที่นี่
การทำสิ่งนี้ในคำสั่ง sudo เดียวก็เป็นไปได้เช่นกัน สมมติว่าผู้ใช้ของคุณมีสิทธิ์ในการเข้าถึงไฟล์ใช้ sudo เฉพาะในส่วน cpio เช่นนี้:
ls /path/source/some*files | cpio -pdm --owner $USER /path/target/directory/
ในกรณีข้างต้นฉันใช้ $ USER แทน $ SUDO_USER เพราะได้รับการประเมินก่อนที่ Sudo จะทำงาน หรือถ้าผู้ใช้ไม่สามารถเข้าถึงรายการไฟล์ให้ใส่ไว้ในสคริปต์ตัวตัดคำและใช้ sudo เพื่อเรียกใช้ wrapper สิ่งนี้อาจกลายเป็นเรื่องยากขึ้น แต่ในกรณีที่ง่ายที่สุด wrapper ใช้อาร์กิวเมนต์สองตัวคือแหล่งที่มาและเป้าหมาย
สิ่งนี้จะเข้าสู่ wrapper "cp_as_user":
ls $1 | cpio -pdm --owner $SUDO_USER $2
จากนั้นใช้กระดาษห่อแบบนี้:
sudo cp_as_user "/ path / to / some * files" / พา ธ / ไปยัง / target / ไดเรกทอรี
sudo cat /etc/foo.txt > ~/foo.txt
. ไฟล์มีแนวโน้มที่จะสามารถอ่านได้โดย root ด้วยเหตุผลเท่านั้นดังนั้นอย่าลืมคำนึงถึงเหตุผลนั้นเมื่อทำการคัดลอกผู้ใช้ที่ไม่ใช่รูทสามารถอ่านได้