Sự cần thiết của lệnh `fakeroot` trong linux


93

Tại sao chúng ta cần fakerootlệnh ở tất cả? Chúng ta có thể đơn giản sử dụng các lệnh sudohoặc sukhông?

Trang người đàn ông nói:

fakeroot - chạy một lệnh trong môi trường giả mạo quyền root để thao tác tệp

About.com nói:

Cung cấp một môi trường gốc giả. Gói này nhằm mục đích kích hoạt một cái gì đó như: dpkg-buildpackage -rfakeroottức là loại bỏ nhu cầu trở thành root để xây dựng gói. Này được thực hiện bằng cách thiết lập LD_PRELOADđể libfakeroot.so, cung cấp hàm bao quanh getuid, chown, chmod, mknod, stat, ..., qua đó tạo ra một môi trường rễ giả. Nếu bạn không hiểu gì về điều này, bạn không cần fakeroot!

Câu hỏi của tôi là, mục đích đặc biệt nào giải quyết điều đó đơn giản suhay sudokhông? Ví dụ, để đóng gói lại tất cả các gói đã cài đặt trong ubfox, chúng tôi đưa ra lệnh sau:

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

Chúng ta có thể thực hiện lệnh trên với sudo hoặc su thay vì fakeroot như thế này không:

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

BIÊN TẬP:

Đang chạy:

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

cho tôi lỗi này:

thư mục điều khiển có quyền 700 (phải> = 0755 và <= 0775)

Bất kỳ lý do tại sao?


6
Vì lý do bảo mật, đó là một ý tưởng tốt để tránh làm root mọi thứ có thể được thực hiện như người dùng bình thường, ngay cả khi bạn có thể chạy sudohoặc suvì đó là máy của bạn. fakerootcó hai cách sử dụng 1) nó lừa các chương trình tin rằng bạn thực sự là người dùng root, điều mà một số phần mềm độc quyền được viết xấu có thể yêu cầu ngay cả khi không cần thiết (thường là nhà phát triển Windows đã chạy Linux) và 2) nó cho phép mô phỏng chế độ tệp và thay đổi quyền sở hữu mà bạn sẽ không Mặt khác, có thể làm, chủ yếu là tạo một tartệp có quyền và quyền sở hữu chính xác, ví dụ hữu ích khi đóng gói phần mềm.
pqnet

1
Tôi nghĩ rằng ghi chú trong đoạn trích từ About.com tóm tắt: Nếu bạn không hiểu gì về điều này, bạn không cần fakeroot! Nếu bạn không thể nghĩ ra một tình huống có fakerootích, thì bạn thực sự không cần nó. Nhưng những người thực tế cần nó hoàn toàn hiểu trường hợp sử dụng.
Christopher Schultz

Câu trả lời:


69

Hãy tưởng tượng rằng bạn là nhà phát triển / bảo trì gói, v.v. làm việc trên một máy chủ từ xa. Bạn muốn cập nhật nội dung của gói và xây dựng lại, tải xuống và tùy chỉnh kernel từ kernel.org và xây dựng nó, v.v. Trong khi thử làm những việc đó, bạn sẽ thấy rằng một số bước yêu cầu bạn phải có rootquyền ( UIDGID0) vì các lý do khác nhau (bảo mật, quyền bị bỏ qua, v.v.). Nhưng không thể có được rootquyền, vì bạn đang làm việc trên một máy từ xa (và nhiều người dùng khác có cùng vấn đề với bạn). Đây là những gì chính xác fakerootlàm: nó giả vờ hiệu quả UIDGIDbằng 0 đối với môi trường đòi hỏi chúng.

Trong thực tế, bạn không bao giờ có được những rootđặc quyền thực sự (ngược lại susudobạn đề cập đến).


vì vậy, tôi không thể sử dụng fakerootđể thay đổi cài đặt hệ thống ?? Vì lệnh chúng ta sẽ chạy sẽ nghĩ rằng nó chạy như root và làm bất cứ điều gì chúng ta muốn nó làm. phải không
mrid

3
@mrid Lưu ý "Trong thực tế, bạn không bao giờ có được quyền root thực sự". Vì vậy, anwser là không
sakisk

53

Để thấy rõ sự khác biệt giữa fakeroot và sudo / su thật, chỉ cần làm:

$ 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

Miễn là bạn ở trong vỏ fakeroot, có vẻ như nếu bạn là root - miễn là bạn không cố gắng làm bất cứ điều gì thực sự cần quyền root. Và đây chính xác là những gì một công cụ đóng gói cần để tạo ra các gói sẽ có ý nghĩa trên bất kỳ máy nào.

Trong thực tế, khi bạn sử dụng fakeroot để đóng gói, điều bạn muốn đạt được là tạo ra các công cụ bạn chạy dưới fakeroot để xem các tệp của bạn là sở hữu của root. Không hơn không kém. Vì vậy, trên thực tế, su hoặc sudo sẽ không hoạt động để có quyền sở hữu tệp đúng.


Không giả mạo có nguy hiểm không? Nếu tôi tạo một tệp với bit suid và rx perm, tệp sẽ được tạo bởi chủ sở hữu, được thực thi bởi bất kỳ ai, với tư cách là root! Hoặc có thể thiết lập bit suid sẽ không hoạt động?
Frizlab

7
Không tốt. Tôi đã thử điều này bản thân mình. Lý do chính cho fakeroot là để có quyền sở hữu: root vào các gói được xây dựng mà không thực sự là root. gói cài đặt sẽ có perms thích hợp, mặc dù.
hanetzer

2
Tất cả đều rất khó hiểu cho đến khi tôi đọc bình luận của @ ntzrmtthihu777!
Shahbaz

Xin lỗi, tôi không hiểu mô tả. Tại sao không vá các công cụ để chúng không phàn nàn nếu bạn không root? Như một câu hỏi liên quan: Rốt cuộc, các tệp mà bạn tạo trong fakeroot không thực sự thuộc sở hữu của root. Điều này có nghĩa là khi tôi cài đặt một .debtệp như vậy , tất cả /usrcác tệp của tôi được sở hữu bởi bất kỳ người dùng nào đã gọi fakeroot?
Julian Schaub - litb

@ JohannesSchaub-litb, không có vấn đề gì. Các tập tin không thuộc sở hữu của root, nhưng bên trong một fakerootshell, chúng trông giống như chúng. Khi gói .deb được tạo bên trong shell này, chủ sở hữu tệp được đọc từ hệ thống tệp (sẽ fakerootchặn và trả về root) và được lưu trong gói. Khi cài đặt gói, dpkg sau đó yêu cầu quyền truy cập root vì gói cho biết tệp nên được sở hữu bởi root.
Shahbaz

45

Vì các câu trả lời rất khó hiểu (với bản thân tôi) và phải mất một số suy nghĩ để hiểu nó ( nhận xét này khiến tôi hiểu nó), tôi sẽ đưa ra một lời giải thích hy vọng tốt hơn.

1. Điều gì xảy ra trong fakeroot

Không có gì nhiều hơn những gì xảy ra với người dùng của riêng bạn. Hoàn toàn không có gì hơn. Nếu bạn fakeroot(mà khi được gọi cung cấp cho bạn một vỏ mới, như sudosẽ), hãy giả vờ làm những thứ mà bạn cần sự cho phép và thoát ra, hoàn toàn không có gì xảy ra.

Nếu bạn nghĩ về nó, nó hoàn toàn lãng phí thời gian. Tại sao bạn sẽ làm những thứ sẽ không thực sự xảy ra? Thật điên rồ. Bạn có thể đơn giản là không làm gì trong số đó và sẽ không có gì khác biệt, vì không có dấu vết nào của nó.

Đợi tí...

2. Dấu vết của fakeroot

thể có một dấu vết còn lại của fakeroot. Chúng ta hãy xem các lệnh trong câu trả lời của MortenSickel khá hay và xứng đáng được nâng cấp:

$ 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

Thoạt nhìn, có vẻ như đã sử dụng fakerootlà một sự lãng phí hoàn toàn thời gian. Cuối cùng, nếu bạn không sử dụng fakeroot, bạn sẽ có được điều tương tự.

Điều tinh tế ở đây là đây:

$ cat root.tst
Wow I have root access

Điều đó có nghĩa là nội dung của tệp vẫn còn nhớ là một root. Bạn có thể nói không sử dụng fakerootsẽ tạo ra kết quả tương tự. Bạn nói đúng, ví dụ này quá đơn giản.

Hãy lấy một ví dụ khác:

$ 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

Hãy xem những gì đã xảy ra. Tôi giả vờ root, điều đó hoàn toàn không hiệu quả, và được tạo ra xy. Tôi giả vờ xthuộc về myuserythuộc về root. Cả hai thực sự thuộc về myuser(như chúng ta có thể thấy cuối cùng), nhưng tôi chỉ giả vờ như vậy.

Sau đó, tôi tạo một danh sách và lưu trí tưởng tượng của tôi vào một tập tin. Sau này khi tôi nhìn lại tập tin, tôi có thể thấy người mà tôi tưởng tượng các tập tin nên được sở hữu. Một lần nữa, chúng không thực sự thuộc sở hữu của những người tôi tưởng tượng, tôi chỉ đơn giản là tưởng tượng điều đó.

3. Vậy ... Tại sao bạn lại muốn điều đó?

Bạn có thể nói rằng tôi không thực sự cần phải giả mạo để tạo danh sách đó. Tôi có thể chỉ cần tạo danh sách, sau đó chỉnh sửa nó để phản ánh trí tưởng tượng của tôi. Bạn nói đúng, bạn không cần fakerootđiều đó. Trên thực tế, biết rằng fakerootthực tế không làm gì cả, bạn không thể có được bất kỳ khả năng nào trước đây bạn không có.

Nhưng , và đây là fakeroottất cả những gì về, chỉnh sửa danh sách có thể là không cần thiết. Vì nó là một gói có thể được cài đặt trên hệ thống của bạn, bạn có một định dạng tared, gziped, xzed, bzip2ed hoặc bất kỳ định dạng nào đang giữ các tệp của bạn với nhau và ghi nhớ các quyền và chủ sở hữu của chúng. Bạn có thể dễ dàng sửa đổi tập tin nén và chỉnh sửa quyền sở hữu của một tập tin? Tôi không biết về bạn, nhưng tôi không thể nghĩ ra cách nào.

Có thể có một công cụ được xây dựng rằng, một khi mọi thứ được nén, nó sẽ sửa đổi tệp nén và lập trình chỉnh sửa quyền sở hữu và quyền? Vâng, có thể. Vì vậy, hoặc bạn có thể giả mạo quyền sở hữu trước khi nén hoặc thay đổi chúng sau. Người Debian quyết định cái trước thì dễ hơn.

4. Tại sao không chỉ sử dụng sudo?

Trước hết, bạn không cần quyền root để xây dựng phần mềm và bạn không cần quyền root để nén chúng. Vì vậy, nếu bạn không cần nó, bạn phải thực sự là một người dùng Windows để nghĩ đến việc có được sự cho phép đó. Nhưng mỉa mai qua một bên, bạn thậm chí có thể không có mật khẩu root.

Bên cạnh đó, giả sử bạn có quyền root. Và giả sử bạn muốn giả vờ rằng một tệp chỉ nên truy cập đọc vào thư mục gốc. Vì vậy, bạn sudo, thực sự thay đổi chủ sở hữu tệp và quyền thành root, bạn thoát khỏi root shell và cố gắng đóng gói mọi thứ. Bạn thất bại vì bây giờ bạn không thể đọc tệp nữa vì bạn không có quyền truy cập root. Vì vậy, bạn phải sudovà nén và xây dựng các gói như root. Hiệu quả, bạn phải làm mọi thứ như root.

Đây là TM xấu .

Là một người đóng gói, bạn không cần quyền root và bạn không nên lấy nó. Khi bạn cài đặt một gói, bạn có thể cần phải cài đặt một số tệp ( A) dưới dạng root và đó là nơi bạn cần quyền root. Tất cả fakerootlàm là để làm điều này có thể. Nó cho phép danh sách packager được Asở hữu bởi root cho trình lưu trữ, để khi gói được giải nén bởi người dùng, trình lưu trữ yêu cầu quyền root và tạo Anhư sở hữu của root.


5
Tuyệt vời writeup, điều này làm cho nó rõ ràng.
Christian Long

1
So either you could fake the ownerships before compressing, or change them after. Debian people decided the former is easier.Điều này giúp tôi khi tôi tiếp tục suy nghĩ 'tại sao không sửa đổi nó sau?'.
aaaaaa

1
Cảm ơn, điều này xóa tan sự nhầm lẫn mà tôi có sau khi đọc câu trả lời của @ Morten
Johannes Schaub - litb

33

AFAIK, fakeroot chạy một lệnh trong một môi trường trong đó nó dường như có quyền root để thao tác tệp. Điều này hữu ích để cho phép người dùng tạo tài liệu lưu trữ (tar, ar, .deb, v.v.) với các tệp trong đó có quyền / quyền sở hữu gốc. Nếu không có fakeroot, người ta sẽ cần phải có quyền root để tạo các tệp cấu thành của tài liệu lưu trữ với quyền và quyền sở hữu chính xác, sau đó đóng gói chúng, hoặc người ta sẽ phải xây dựng tài liệu lưu trữ trực tiếp mà không cần sử dụng bộ lưu trữ.

fakeroot hoạt động bằng cách thay thế các chức năng thư viện thao tác tệp (chmod (), stat (), v.v.) bằng các chức năng mô phỏng hiệu ứng mà các chức năng thư viện thực sự sẽ có, người dùng thực sự đã root.

Tóm tắc :

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

Kiểm tra thêm tại đây: fakeroot


@MaskTheSmokin: Vì vậy, fakeroot cung cấp cho bạn sức mạnh siêu người dùng chỉ cho các hoạt động thao tác tệp, đúng không.
gkt

@ gkt.pro: Tôi đoán là có.

10
Nó không thực sự mang lại sức mạnh cho người dùng, nó chỉ làm giả nó - chương trình chạy trong nó nghĩ rằng nó có quyền root, trong khi nó thực sự vẫn sử dụng các đặc quyền bình thường của người dùng.
Paŭlo Ebermann

2
Đâu là sự khác biệt giữa the program running in it thinks it has root privilegesvà chương trình có quyền root? Nếu tôi có thể thực hiện một rm -rf /chương trình và chạy nó, tôi nghĩ rằng tôi có quyền root ...
người dùng không xác định

10
@userunknown Bạn có thể bỏ qua việc rmkiểm tra xem bạn có đủ quyền hay không, nhưng chính hạt nhân sẽ không cho phép bạn làm điều đó; các unlinkcuộc gọi hệ thống sẽ thất bại. Ứng dụng không phụ thuộc vào ứng dụng một mình để xử lý các quyền hoặc bạn có thể viết ứng dụng của riêng bạn mà không kiểm tra quyền và làm bất cứ điều gì bạn muốn với nó
Michael Mrozek

11

Tôi đã sử dụng nó cho các kịch bản xây dựng gói. Tôi không chắc chắn rằng người đang chạy tập lệnh có quyền truy cập cấp gốc, nhưng tập lệnh vẫn cần để tạo, giả sử, một tập tin tar chứa các tập tin thuộc về root. Cách đơn giản nhất để thực hiện là chạy tập lệnh xây dựng gói theo fakeroot, điều này đã lừa người lưu trữ tin rằng các tệp thuộc về root và đóng gói chúng như vậy trong kho lưu trữ. Bằng cách này, khi gói được giải nén vào máy đích (trên một máy khác hoàn toàn), các tệp không thuộc về người dùng lạ hoặc không tồn tại.

Nghĩ về nó, nơi duy nhất tôi thấy là để xây dựng một số loại lưu trữ: rootfs của các hệ thống nhúng, lưu trữ tar.gz, gói vòng / phút, gói .deb, v.v.


1
fakerootlà một công cụ khắc phục cho phần mềm đóng gói bị lỗi: không có lý do gì bạn cần phải root để tạo các gói như vậy, nhưng vì chúng không cho phép bạn chỉ định quyền truy cập tệp theo bất kỳ cách nào khác ngoài việc đặt chúng trực tiếp vào hệ thống tệp trước khi bạn không có sự lựa chọn
pqnet

3

Một cách sử dụng phổ biến là tìm ra tệp nào mà tệp nhị phân bị lỗi thực sự muốn truy cập. Đó là, tìm ra và sửa chữa hoặc khắc phục các lỗi gây ra bởi các đường dẫn được mã hóa cứng và xử lý ngoại lệ không đúng.


1

Bạn có thể sử dụng fakeroot mà không thực sự có quyền root. Nếu bạn đã suvà / hoặc sudobạn có thể phá hủy hệ thống của mình một cách đơn giản rm -rf /, nhưng với fakeroot nhiều nhất bạn sẽ xóa thư mục chính của mình.


2
Điều đó không giải thích sự cần thiết cho fakeroot. Bạn có thể loại bỏ thư mục nhà của bạn như chính mình.
JMCF125

1

Câu trả lời đơn giản:

su và sudo chạy các lệnh như root. fakeroot không, bên ngoài sắp xếp hộp cát một phần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.