มีวิธีบอก sudo เพื่อตั้งชื่อผู้ใช้ของฉันเป็นเจ้าของไฟล์ที่สร้างขึ้นแทนการรูทหรือไม่?


19

ถ้าฉันทำsudo cp /etc/foo.txt ~/foo.txtไฟล์ใหม่จะถูกสร้างขึ้นพร้อมกับrootเป็นเจ้าของ

ตอนนี้ฉันไม่เห็นวิธีอื่นนอกเหนือจากการใช้คำสั่งสองคำสั่งสุดท้าย ( lsเพื่อชี้แจงกรณีการใช้งาน):

belmin@server1$ ls /etc/foo.txt
>  -rw------- 1 root root 3848 Mar  6 20:35 /etc/foo.txt
>
belmin@server1$ sudo cp /etc/foo.txt ~/foo.txt
belmin@server1$ sudo chown belmin: $_

ฉันต้องการ:

  1. ทำในsudoคำสั่งเดียว
  2. ไม่ต้องระบุผู้ใช้ปัจจุบันของฉัน (อาจใช้ตัวแปรหรือไม่)

sudo cat /etc/foo.txt > ~/foo.txt. ไฟล์มีแนวโน้มที่จะสามารถอ่านได้โดย root ด้วยเหตุผลเท่านั้นดังนั้นอย่าลืมคำนึงถึงเหตุผลนั้นเมื่อทำการคัดลอกผู้ใช้ที่ไม่ใช่รูทสามารถอ่านได้
jw013

คำตอบ:


32

ใช้installแทนcp:

sudo install -o belmin /etc/foo.txt ~/foo.txt

installไม่ได้ตระหนักถึง ขอขอบคุณ.
Belmin Fernandez

4
@BelminFernandez: เพื่อรองรับการตั้งค่าที่สองของคุณ:sudo install -o "$USER" /etc/foo.txt ~/foo.txt
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

14

ด้วยPOSIX ได้cpที่คุณสามารถsudo cp -p foo barที่จะรักษาข้อมูลเมตาของแฟ้มต่อไปนี้เมื่อคัดลอก:

  • เข้าถึงเวลา
  • เวลาปรับเปลี่ยน
  • ID ผู้ใช้
  • รหัสกลุ่ม
  • โหมด

หากคุณต้องการตั้งค่าที่แตกต่างกันของผู้ใช้วิธีการแก้ปัญหาของ JennyDที่ดีที่สุดคือ


2
ใช้งานได้เฉพาะเมื่อไฟล์ต้นฉบับเป็นของผู้ใช้เป้าหมาย
Jenny D

4
ฉันคิดว่าคนที่ใช้ sudo ไม่ได้เป็นเจ้าของไฟล์ต้นฉบับมิฉะนั้นพวกเขาไม่จำเป็นต้องใช้ sudo
EightBitTony

@EightBitTony คุณไม่จำเป็นต้องsudoคัดลอกไฟล์ที่คุณไม่ได้เป็นเจ้าของ คุณเพียงแค่ต้องอ่านการเข้าถึงหลังจากทั้งหมด
l0b0

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

2
เป็นไปได้ในทางทฤษฎีว่าไฟล์นั้นเป็นของผู้ใช้เป้าหมาย แต่อยู่ในไดเรกทอรีที่ผู้ใช้เป้าหมายไม่ได้รับอนุญาตให้ป้อน แต่มันก็ไม่น่าเป็นไปได้ :-)
เจนนี่ D

8

ถ้าคุณทำ:

sudo cat /etc/foo.txt > ~/foo.txt

จากนั้น~/foo.txtจะเปิดโดยเชลล์ในขณะที่คุณ (สร้างขึ้นด้วยข้อมูลประจำตัวของคุณ) จากนั้นsudoจะถูกดำเนินการโดย stdout ของมันถูกเปลี่ยนเส้นทางไปที่

ในที่สุดไฟล์จะเป็นของคุณ

ประเภทของวิธีการที่ยังช่วยให้การ จำกัด rootสิ่งที่ทำโดย ที่นี่rootใช้สิทธิ์ของเขาเท่านั้นในการเปิด/etc/foo.txtแต่จะไม่ทำสิ่งที่อาจเป็นอันตราย (เปิดไฟล์สำหรับเขียนซึ่งอาจมีผลกระทบที่ไม่ดีหาก~/foo.txtเป็น symlink เป็นต้น)


2
สิ่งนี้ถือว่าผู้ใช้สามารถเขียนไปยังไดเรกทอรีเป้าหมายได้
Johan

3

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

ไม่มีวิธีสำหรับsudoตัวเองในการจัดการสิ่งนั้นเนื่องจากทุกสิ่งที่sudoทำอยู่นั้นเป็นการสลับคุณไปยังผู้ใช้รายอื่นเพื่อดำเนินการคำสั่ง

คุณจะต้อง

  1. ใช้สองคำสั่งต่อไป (หรือคำสั่งผสมหนึ่งคำ)
  2. ค้นหาคำสั่งอื่น (เช่นติดตั้งเห็นในคำตอบอื่น)
  3. sudoหรือเขียนสคริปต์และรันสคริปต์ที่ผ่าน

1

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 / ไดเรกทอรี

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