การสร้างไฟล์และไดเรกทอรีด้วยเจ้าของ (ผู้ใช้ / กลุ่ม) ในขณะที่ sudoing


22

ฉันต้องการwgetบางสิ่งบางอย่าง (ส่งผลให้ไฟล์บีบอัดใน cwd) จากนั้นฉันต้องแยกมันแล้วทำบางสิ่งที่คัดลอก / ย้าย / แก้ไขและในที่สุดก็อาจเรียกใช้สคริปต์ (จากไฟล์เก็บถาวรที่ดาวน์โหลด)

ตอนนี้งานทั้งหมดเหล่านี้โดยตรง ( wgetแยก ฯลฯ ) หรือทางอ้อม (เรียกใช้สคริปต์) ส่งผลในการสร้างไฟล์และไดเรกทอรี (ทั้งหมดในไดเรกทอรีการทำงานปัจจุบัน) ฉันทำทุกสิ่งนี้เป็นroot(ไม่มีวิธีที่จะทำกับผู้ใช้ขั้นสุดท้ายที่ต้องการ)

ปัญหาคือ: สิ่งใดก็ตามที่สร้างขึ้นในกระบวนการเป็นเจ้าของโดยผู้ใช้รูทหรือ sudo เมื่อฉันทำ (และบางครั้งในช่วงกลางทาง) ฉันต้องออกชุดchmodและchownคำสั่งเพื่อทำสิ่งที่ถูกต้อง

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

คำตอบ:


26

คุณสามารถเมื่อสคริปต์ของคุณจะถูกดำเนินการตามที่sudo -u username touch filename rootมันมักจะไม่ต้องใช้รหัสผ่านขึ้นอยู่กับsudoersการกำหนดค่าของคุณ

su username -c touch filenameผลัดกันทำงาน อาร์กิวเมนต์เพิ่มเติมจะถูกส่งไปยังเชลล์ของผู้ใช้และ-cตัวเลือกสำหรับเชลล์ดำเนินการคำสั่งที่ระบุโดยการประชุม


บางคำสั่ง (ชอบmkdir) สนับสนุนอาร์กิวเมนต์เพื่อระบุการอนุญาต:

mkdir -m 0700 foo

โดยค่าเริ่มต้นการทำงานของไฟล์จะคำนึงถึงumaskชุดของเชลล์ มันกำหนดซึ่งสิทธิ์ที่จะปฏิเสธ umaskของ0022ตัวอย่างไม่ได้กำหนดสิทธิ์ในการเขียนสำหรับกลุ่มและอื่น ๆ ตั้งค่าเป็น0077ป้องกันมิให้กลุ่มและบุคคลอื่นได้รับการอนุญาต


คุณสามารถตั้งค่าsetgidไดเรกทอรีบนเพื่อสร้างไฟล์ทั้งหมดภายในสืบทอดความเป็นสมาชิกกลุ่มของพวกเขา:

chmod g+s someDir

Unixes บางตัวรองรับการทำงานแบบเดียวกันสำหรับsetuid( chmod u+s) แต่ไม่ใช่ Linux


1
ฉันคิดว่ามันปลอดภัยที่จะสมมติว่าไม่มีการสนับสนุนเฉพาะสำหรับสิ่งที่คุณขอ เฉพาะผู้ใช้ขั้นสูงเท่านั้นที่สามารถchownไฟล์ให้กับผู้ใช้คนอื่นและการตั้งค่าเริ่มต้นเช่นนี้มีแนวโน้มที่จะเกิดข้อผิดพลาดของผู้ใช้ให้สิทธิ์ผู้ใช้รายอื่นโดยที่rootผู้ใช้ไม่ได้รับรู้
Daniel Beck

10

มีวิธีอื่นที่ค่อนข้างสง่างามฉันคิดว่า ใช้การติดตั้ง (1)

ตัวอย่างเช่น zabbix-agentd ต้องการโฟลเดอร์ย่อยภายใน / var / run แต่การกระจายล่าสุดกำลังใช้ tmpfs สำหรับ / var / run ดังนั้นไดเรกทอรีจะไม่สามารถรีบูตได้ ฉันแก้ไขมันโดยการสร้างไฟล์ / etc / sysconfig / zabbix-agentd บรรจุ:

install -g zabbix -o zabbix -d /var/run/zabbix

1
เพิ่ม-m 0700เช่น คำตอบ
แหวนØ

3
โปรดทราบว่าinstallสร้างไดเรกทอรีแล้วเปลี่ยนเจ้าของ / กลุ่ม ดังนั้นจึงเป็นช่วงเวลาสั้น ๆ ที่ไดเรกทอรีไม่มีเจ้าของ / กลุ่มที่ระบุ ในบางบริบทอาจมีความสำคัญ
user368507

สิ่งนี้ใช้ได้กับ Alpine Linux
Mauricio Sánchez

3

บนระบบที่เหมือน Unix ไฟล์ที่สร้างขึ้นใหม่และไดเรกทอรีเป็นเจ้าของโดยเจ้าของกระบวนการที่สร้างพวกเขา โปรแกรมอรรถประโยชน์มาตรฐานโดยทั่วไปไม่มีตัวเลือกในการเปลี่ยนเจ้าของไฟล์ที่สร้างขึ้น

ตัวแปรที่มี UID และ GID ของผู้ใช้ดั้งเดิม

หากคุณรันคำสั่งบางอย่างซ้ำ ๆ คุณสามารถใช้ตัวแปร$SUDO_UIDและ$SUDO_GIDเพื่ออ้างถึงผู้ใช้ที่เรียกใช้sudo:

sudo sh -c "do_something ; chown -R \"\$SUDO_UID:\$SUDO_GID\" files and directories"

รับรายการไฟล์และไดเรกทอรีที่สร้างขึ้นโดยอัตโนมัติ

หากคุณต้องการรับรายการไฟล์และไดเรกทอรีที่สร้าง (และอาจแก้ไข) โดยอัตโนมัติคุณสามารถเรียกใช้คำสั่งของคุณภายใต้straceการเฝ้าระวังซึ่งขึ้นอยู่กับptrace()syscall:

strace -qqfe open,creat,mkdir,link,symlink,mknod -o '|your_processing_of_strace_output' do_something

หรือคุณสามารถใช้ตัวอย่างเช่นInstallwatchซึ่งเป็นไปตามLD_PRELOADกลไก

แนวคิดสำหรับการทำงานต่อไป

ขึ้นอยู่กับวิธีการที่กล่าวถึงข้างต้นมันเป็นไปได้ที่จะสร้างเครื่องมือที่จะเปลี่ยนเจ้าของโดยอัตโนมัติและสิทธิ์การเข้าถึงของไฟล์ที่สร้าง / แก้ไข การใช้งานอาจเป็นเรื่องง่ายเหมือน:

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