ความต้องการคำสั่ง 'fakeroot' ใน linux คืออะไร


93

ทำไมเราต้องมีfakerootคำสั่งเลย? เราไม่สามารถเพียงแค่ใช้sudoหรือsuคำสั่ง?

หน้าคนพูดว่า:

fakeroot - รันคำสั่งในสภาพแวดล้อมที่ปลอมแปลงสิทธิ์ของรูทสำหรับการจัดการไฟล์

About.com พูดว่า:

ให้สภาพแวดล้อมของรูทปลอม แพคเกจนี้มีวัตถุประสงค์เพื่อเปิดใช้งานบางอย่างเช่น: dpkg-buildpackage -rfakerootเพื่อลบความต้องการที่จะกลายเป็นรากสำหรับการสร้างแพคเกจ นี้จะกระทำโดยการตั้งค่าLD_PRELOADการlibfakeroot.soซึ่งมีห่อรอบgetuid, chown, chmod, mknod, stat, ... , ดังนั้นการสร้างสภาพแวดล้อมที่รากของปลอม หากคุณไม่เข้าใจสิ่งนี้คุณไม่จำเป็นต้องทำfakeroot!

คำถามของฉันคืออะไรมันมีวัตถุประสงค์พิเศษอะไรที่แก้ง่าย ๆsuหรือsudoเปล่า? ตัวอย่างเช่นสำหรับการแบ่งบรรจุหีบห่อที่ติดตั้งใหม่ทั้งหมดใน ubuntu เราให้คำสั่งต่อไปนี้:

$ fakeroot -u dpkg-repack `dpkg --get-selections | grep install | cut -f1`

เราสามารถทำคำสั่งข้างต้นกับ sudo หรือ su แทน fakeroot ดังนี้:

$ sudo dpkg-repack `dpkg --get-selections | grep install | cut -f1`

แก้ไข:

วิ่ง:

$ sudo dpkg-repack `dpkg --get-selections | grep install | cut -f1`

ให้ข้อผิดพลาดนี้กับฉัน:

ไดเรกทอรีควบคุมมีสิทธิ์ที่ไม่เหมาะสม 700 (ต้อง>> = 0755 และ <= 0775)

มีเหตุผลอะไร


6
มันเป็นความคิดที่ดีด้วยเหตุผลด้านความปลอดภัยเพื่อหลีกเลี่ยงการทำในสิ่งที่ทุกคนสามารถทำได้ในฐานะผู้ใช้ธรรมดาถึงแม้ว่าคุณจะสามารถเรียกใช้sudoหรือsuเพราะมันเป็นเครื่องของคุณ fakerootมีสองการใช้งาน 1) มันโง่โปรแกรมที่เชื่อว่าคุณเป็นผู้ใช้รากซึ่งซอฟต์แวร์กรรมสิทธิ์บางอย่างที่เขียนไม่ดีอาจต้องแม้ว่าไม่จำเป็น (โดยปกตินักพัฒนา Windows ไป Linux) และ 2) มันอนุญาตให้เลียนแบบโหมดไฟล์และการเปลี่ยนแปลงความเป็นเจ้าของ ไม่เช่นนั้นส่วนใหญ่จะสร้างtarไฟล์ที่มีสิทธิ์และความเป็นเจ้าของที่ถูกต้องซึ่งมีประโยชน์เช่นเมื่อบรรจุซอฟต์แวร์
pqnet

1
ฉันคิดว่าข้อความในข้อความที่ตัดตอนมาจาก About.com สรุปรวม: ถ้าคุณไม่เข้าใจสิ่งนี้คุณไม่จำเป็นต้องใช้fakeroot! หากคุณไม่สามารถนึกถึงสถานการณ์ที่fakerootมีประโยชน์คุณก็ไม่จำเป็นต้องใช้มัน แต่คนที่ทำในความเป็นจริงต้องการมันอย่างสมบูรณ์เข้าใจการใช้งานกรณี
Christopher Schultz

คำตอบ:


69

ลองนึกภาพว่าคุณเป็นผู้พัฒนา / ดูแลแพ็คเกจ ฯลฯ ทำงานบนเซิร์ฟเวอร์ระยะไกล คุณต้องการอัปเดตเนื้อหาของแพ็คเกจและสร้างใหม่ดาวน์โหลดและปรับแต่งเคอร์เนลจาก kernel.org และสร้าง ฯลฯ ในขณะที่พยายามทำสิ่งเหล่านั้นคุณจะพบว่าบางขั้นตอนจำเป็นต้องมีrootสิทธิ์ ( UIDและGID0) ด้วยเหตุผลต่าง ๆ (ความปลอดภัย, การอนุญาตที่ถูกมองข้าม, ฯลฯ ) แต่เป็นไปไม่ได้ที่จะได้รับrootสิทธิ์เนื่องจากคุณกำลังทำงานกับเครื่องระยะไกล (และผู้ใช้รายอื่นมีปัญหาเช่นเดียวกับคุณ) นี่คือสิ่งที่fakerootทำ: มันแกล้งมีประสิทธิภาพUIDและเป็นGID0 กับสภาพแวดล้อมที่ต้องการพวกเขา

ในทางปฏิบัติที่คุณไม่เคยได้รับจริงrootสิทธิพิเศษ (ในฝั่งตรงข้ามsuและsudoที่คุณพูดถึง)


ดังนั้นฉันไม่สามารถใช้fakerootเพื่อเปลี่ยนการตั้งค่าระบบ ?? เพราะคำสั่งที่เราจะเรียกใช้จะคิดว่ามันทำงานเหมือนรูทและทำทุกอย่างที่เราต้องการ จะไม่ได้
mrid

3
@mrid หมายเหตุ "ในทางปฏิบัติคุณจะไม่ได้รับสิทธิพิเศษที่แท้จริง" ดังนั้น Anwser ไม่มี
sakisk

53

หากต้องการดูความแตกต่างอย่างชัดเจนระหว่าง fakeroot และ sudo / su จริงให้ทำดังนี้

$ fakeroot
# echo "Wow I have root access" > root.tst
# ls -l root.tst
-rw-rw-r-- 1 root root   23 Oct 25 12:13 root.tst
# ls -l /root
ls: cannot open directory /root: Permission denied
# exit
$ ls -l root.tst
-rw-rw-r-- 1 ubuntu ubuntu 23 Oct 25 12:13 root.tst

ตราบใดที่คุณอยู่ในเชลล์ fakeroot ดูเหมือนว่าคุณเป็นรูท - ตราบใดที่คุณไม่พยายามทำสิ่งใด ๆ ที่จำเป็นต้องได้รับสิทธิพิเศษรูท และนี่คือสิ่งที่เครื่องมือบรรจุภัณฑ์จำเป็นต้องใช้ในการทำบรรจุภัณฑ์ที่เหมาะสมกับเครื่องจักรทุกชนิด

ในความเป็นจริงเมื่อคุณใช้ fakeroot สำหรับบรรจุภัณฑ์สิ่งที่คุณต้องการบรรลุคือการทำเครื่องมือที่คุณใช้ภายใต้ fakeroot เพื่อดูไฟล์ของคุณเป็นเจ้าของโดย root ไม่มีอะไรเพิ่มเติมไม่น้อยไปกว่านี้ ดังนั้นในความเป็นจริง su หรือ sudo จะไม่ทำงานเพื่อให้ได้กรรมสิทธิ์ในไฟล์ที่ถูกต้อง


ผู้ทำอันตรายไม่ได้หรือ ถ้าฉันสร้างไฟล์ด้วย suid bit และ rx perm ไฟล์นั้นจะถูกสร้างโดย root ทุกคนสามารถใช้งานได้ในฐานะ root! หรือบางทีการตั้งค่า suid bit จะไม่ทำงาน?
Frizlab

7
ไม่ดี. ฉันลองทำเอง เหตุผลหลักสำหรับ fakeroot คือการได้รับสิทธิ์การเป็นเจ้าของ: รูทไปยังแพ็คเกจที่สร้างขึ้นโดยไม่ต้องเป็นรูท แพคเกจที่ติดตั้งจะมี perms ที่เหมาะสมแม้ว่า
hanetzer

2
มันสับสนมากจนกระทั่งฉันอ่านความคิดเห็นของ @ ntzrmtthihu777!
Shahbaz

ขออภัยฉันไม่เข้าใจคำอธิบาย ทำไมไม่แก้ไขเครื่องมือเพื่อที่พวกเขาจะไม่บ่นถ้าคุณไม่รูท? ในฐานะที่เป็นคำถามที่เกี่ยวข้อง: หลังจากที่ทุกไฟล์ที่คุณสร้างขึ้นภายใต้ fakeroot จะไม่จริงเป็นของราก นี้จะไม่ได้หมายความว่าเมื่อติดตั้งดังกล่าวเป็น.debไฟล์ของฉันทุก/usrไฟล์ที่เป็นเจ้าของโดยใครก็ตามที่ผู้ใช้ที่เรียกว่าfakeroot?
Johannes Schaub - litb

@ JohannesSchaub-litb ไม่มีจุดนั้น ไฟล์ไม่ได้เป็นเจ้าของโดย root แต่ภายในfakerootเชลล์พวกเขาดูเหมือนว่าจะเป็น เมื่อแพ็กเกจ. deb ถูกสร้างขึ้นภายในเชลล์นี้เจ้าของไฟล์จะถูกอ่านจากระบบไฟล์ (ซึ่งfakerootดักจับและส่งคืนroot) และเก็บไว้ในแพ็คเกจ เมื่อติดตั้งแพ็กเกจ dpkg ต้องใช้การเข้าถึงรูทเนื่องจากแพ็กเกจระบุว่าไฟล์ควรเป็นเจ้าของโดย root
Shahbaz

45

เนื่องจากคำตอบนั้นยากที่จะเข้าใจ (กับตัวเอง) และใช้ความคิดที่จะเข้าใจ ( ความคิดเห็นนี้ทำให้ฉันเข้าใจ) ฉันจะอธิบายให้ดีกว่านี้

1. เกิดอะไรขึ้นใน fakeroot

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

ถ้าคุณคิดเกี่ยวกับมันมันเสียเวลาทั้งหมด ทำไมคุณถึงทำสิ่งที่ไม่เกิดขึ้นจริง? มันบ้า คุณสามารถทำได้โดยไม่ทำอะไรเลยและจะไม่มีความแตกต่างเนื่องจากไม่มีร่องรอยของมัน

รอสักครู่ ...

2. ร่องรอยของ fakeroot

มีอาจfakerootจะมีร่องรอยเหลืออยู่ของ ลองดูคำสั่งในคำตอบของ MortenSickelที่สวยดีและสมควรได้รับการโหวต:

$ fakeroot
# echo "Wow I have root access" > root.tst
# ls -l root.tst
-rw-rw-r-- 1 root root   23 Oct 25 12:13 root.tst
# ls -l /root
ls: cannot open directory /root: Permission denied
# exit
$ ls -l root.tst
-rw-rw-r-- 1 ubuntu ubuntu 23 Oct 25 12:13 root.tst

เมื่อดูอย่างรวดเร็วครั้งแรกดูเหมือนว่าการใช้งานแล้วfakerootเป็นเรื่องเสียเวลาทั้งสิ้น ในท้ายที่สุดถ้าคุณไม่ได้ใช้fakerootคุณก็จะได้สิ่งเดียวกัน

สิ่งที่ลึกซึ้งนี่คือสิ่งนี้:

$ cat root.tst
Wow I have root access

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

ลองทำตัวอย่างอื่น:

$ fakeroot
# touch x
# touch y
# chown myuser:myuser x
# ls -l > listing
# exit
$ ls -l
total 4
-rw-rw-r-- 1 myuser myuser 152 Jan  7 21:39 listing
-rw-rw-r-- 1 myuser myuser   0 Jan  7 21:39 x
-rw-rw-r-- 1 myuser myuser   0 Jan  7 21:39 y
$ cat listing
total 0
-rw-rw-r-- 1 root   root   0 Jan  7 21:39 listing
-rw-rw-r-- 1 myuser myuser 0 Jan  7 21:39 x
-rw-rw-r-- 1 root   root   0 Jan  7 21:39 y

เรามาดูกันว่าเกิดอะไรขึ้น ผมแกล้งทำเป็นrootซึ่งไม่ได้ผลโดยสิ้นเชิงและสร้างและx yผมแกล้งทำเป็นxจะเป็นmyuserและจะเป็นy rootทั้งคู่เป็นของจริงmyuser(อย่างที่เราเห็นในตอนท้าย) แต่ฉันแค่แกล้งทำเป็นว่าเป็นอย่างนั้น

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

3. ดังนั้น ... คุณต้องการอะไรอีก

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

แต่และนี่คือสิ่งที่fakerootเกี่ยวกับการแก้ไขรายชื่ออาจไม่สำคัญ เนื่องจากมีแพ็คเกจที่สามารถติดตั้งในระบบของคุณคุณมีรูปแบบtared, gziped, xzed, bzip2ed หรือรูปแบบอื่น ๆ ที่เก็บไฟล์ของคุณไว้ด้วยกันและจดจำสิทธิ์และเจ้าของของพวกเขา คุณสามารถแก้ไขไฟล์บีบอัดและแก้ไขความเป็นเจ้าของไฟล์ได้อย่างง่ายดายหรือไม่? ฉันไม่รู้เกี่ยวกับคุณ แต่ฉันไม่สามารถคิดได้

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

4. ทำไมไม่เพียงใช้sudo?

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

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

นี้เป็น Bad TM

ในฐานะผู้บรรจุหีบห่อคุณไม่จำเป็นต้องได้รับอนุญาตรูทและคุณไม่ควรได้รับมัน เมื่อคุณติดตั้งแพคเกจคุณอาจต้องติดตั้งไฟล์บางไฟล์ ( A) ในฐานะรูทและคุณต้องได้รับอนุญาตจากรูท ทั้งหมดfakerootนี้คือการทำให้เป็นไปได้ อนุญาตให้รายการผู้Aทำแพ็กเกจเป็นเจ้าของโดย root สำหรับผู้จัดเก็บดังนั้นเมื่อแพ็กเกจถูกคลายบีบอัดโดยผู้ใช้ผู้จัดเก็บต้องการการอนุญาตรูทและสร้างAเป็นเจ้าของโดยรูท


5
การเขียนที่ยอดเยี่ยมทำให้ชัดเจน
Christian Long

1
So either you could fake the ownerships before compressing, or change them after. Debian people decided the former is easier.สิ่งนี้ช่วยฉันในขณะที่ฉันคิดอยู่เสมอว่า 'ทำไมไม่แก้ไขหลังจากนี้'
aaaaaa

1
ขอบคุณนี่เป็นการขจัดความสับสนที่ฉันได้หลังจากอ่านคำตอบของ @ Morten
Johannes Schaub - litb

33

AFAIK, fakeroot รันคำสั่งในสภาพแวดล้อมที่ดูเหมือนว่าจะมีสิทธิพิเศษสำหรับการจัดการไฟล์ สิ่งนี้มีประโยชน์สำหรับการอนุญาตให้ผู้ใช้สร้างไฟล์เก็บถาวร (tar, ar, .deb ฯลฯ ) พร้อมกับไฟล์ที่อยู่ในนั้นด้วยสิทธิ์อนุญาต / ความเป็นเจ้าของราก หากไม่มีคนทำขนมปังคนหนึ่งจะต้องมีสิทธิ์รูทในการสร้างไฟล์ส่วนประกอบของไฟล์เก็บถาวรด้วยสิทธิ์ที่ถูกต้องและความเป็นเจ้าของจากนั้นจัดเก็บไฟล์เหล่านั้นหรือจะสร้างไฟล์เก็บถาวรโดยตรงโดยไม่ต้องใช้ Archiver

fakeroot ทำงานได้โดยแทนที่ฟังก์ชั่นห้องสมุดการจัดการไฟล์ (chmod (), stat () ฯลฯ ) โดยคนที่จำลองผลกระทบที่ฟังก์ชั่นห้องสมุดจริงจะต้องมีผู้ใช้เป็นรากจริงๆ

เรื่องย่อ:

 fakeroot [-l|--lib library] [--faked faked-binary] [--] [command]  

ตรวจสอบเพิ่มเติมได้ที่นี่: fakeroot


@MaskTheSmokin: ดังนั้น fakeroot ให้พลังผู้ใช้ระดับสูงสำหรับการดำเนินการจัดการไฟล์เท่านั้น
gkt

@ gkt.pro: ฉันเดาใช่

10
มันไม่ได้ให้พลังกับผู้ใช้มากนัก แต่มันแกล้งทำมัน - โปรแกรมที่ทำงานอยู่ในนั้นคิดว่ามันมีสิทธิ์ใช้งานรูทในขณะที่มันยังคงใช้สิทธิ์ปกติของผู้ใช้
Paŭlo Ebermann

2
ข้อแตกต่างระหว่างthe program running in it thinks it has root privilegesและโปรแกรมที่มีสิทธิ์ใช้งานรูตอยู่ที่ไหน ถ้าฉันสามารถทำrm -rf /และโปรแกรมได้ฉันคิดว่าฉันมีสิทธิ์
ใช้งาน

10
@userunknown คุณอาจสามารถข้ามการrmตรวจสอบว่าคุณมีสิทธิ์เพียงพอ แต่เคอร์เนลไม่ยอมให้คุณทำ การunlinkเรียกระบบจะล้มเหลว ไม่ขึ้นอยู่กับแอปพลิเคชันเพียงอย่างเดียวในการจัดการสิทธิ์หรือคุณสามารถเขียนแอปพลิเคชันของคุณเองที่ไม่ตรวจสอบสิทธิ์และทำสิ่งที่คุณต้องการด้วย
Michael Mrozek

11

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

เมื่อนึกถึงสถานที่แห่งเดียวที่ฉันเห็นก็คือการสร้างที่เก็บถาวรบางประเภท: รูทของระบบฝังตัว, คลังเก็บ tar.gz, แพ็คเกจ rpm, แพ็คเกจ. deb ฯลฯ


1
fakerootเป็นเครื่องมือในการแก้ปัญหาสำหรับซอฟต์แวร์บรรจุภัณฑ์ bugged: ไม่มีเหตุผลที่คุณจะต้องรูทเพื่อสร้างแพ็คเกจดังกล่าว แต่เนื่องจากมันไม่อนุญาตให้คุณระบุการอนุญาตของไฟล์ด้วยวิธีอื่นนอกเหนือจากการตั้งค่าโดยตรงในระบบไฟล์ก่อนที่คุณไม่มี ตัวเลือก
pqnet

3

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


1

คุณสามารถใช้ fakeroot โดยไม่มีสิทธิ์รูท หากคุณมีsuและ / หรือsudoคุณจะสามารถทำลายระบบของคุณได้อย่างง่ายดายrm -rf /แต่ด้วย fakeroot ที่มากที่สุดคุณจะลบไดเรกทอรีบ้านของคุณ


2
fakerootแต่นั่นไม่ได้อธิบายความจำเป็นในการ คุณสามารถลบโฮมไดเร็กตอรี่ของคุณออกได้
JMCF125

1

คำตอบง่ายๆ:

คำสั่ง su และ sudo รันเป็น root fakeroot ไม่ได้อยู่นอกการจัดเรียงของกล่องทรายบางส่วน

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