it-swarm-vi.com

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

Tại sao chúng ta cần lệnh fakeroot? Chúng ta có thể đơn giản sử dụng các lệnh Sudo hoặc su khô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 cho 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 kích hoạt một cái gì đó như: dpkg-buildpackage -rfakeroot tức là để loại bỏ nhu cầu trở thành root để xây dựng gói. Điều này được thực hiện bằng cách đặt LD_PRELOAD đến libfakeroot.so, cung cấp trình bao bọc xung quanh getuid, chown, chmod, mknod, stat, ..., từ đó tạo ra giả mạo môi trường gốc. 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 được một su hoặc Sudo đơn giản? 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`

CHỈNH SỬA :

Đ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?

102
gkt

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ó root Rights (UIDGID 0) vì những lý do khác nhau (bảo mật, quyền bị bỏ qua, v.v.). Nhưng không thể có quyền root, 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 chính xác là những gì fakeroot thực hiện: nó giả vờ hiệu quả UIDGID của 0 đối với môi trường yêu cầu chúng.

Trong thực tế, bạn không bao giờ có được các đặc quyền root thực (ngược lại với suSudo mà bạn đề cập).

70
sakisk

Để 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

Chừng nào bạn còn ở trong fakeroot Shell, có vẻ như 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 đặc 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.

56
MortenSickel

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 làm cho tôi hiểu nó), tôi sẽ đưa ra một lời giải thích tốt hơn hy vọng.

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 sẽ cung cấp cho bạn một Shell mới, như Sudo would), hãy giả vờ làm những việc 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 thực hiện bất kỳ điều gì trong đó và sẽ không có sự khác biệt, vì không có dấu vết của nó.

Đợi tí...

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

could là 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á đẹp và xứng đáng nhận được sự ủng hộ:

$ 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 fakeroot là một sự lãng phí hoàn toàn thời gian. Cuối cùng, nếu bạn chưa 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à root. Bạn có thể nói không sử dụng fakeroot sẽ 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ờ là root, hoàn toàn không hiệu quả và đã tạo xy. Tôi giả vờ x thuộc về myusery thuộ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ờ nó sẽ như thế.

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 đã đúng, bạn không cần fakeroot cho điều đó. Trên thực tế, biết rằng fakeroot không thực sự 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à tất cả những gì fakeroot, việc chỉnh sửa danh sách có thể 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ó tared, gziped, xzed, bzip2ed hoặc bất kỳ định dạng nào khác đ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 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 Sudo và nén và xây dựng gói dưới dạng root. Hiệu quả, bạn phải làm mọi thứ như root.

Thật tệTM.

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 gói, bạn có thể cần cài đặt một số tệp (A) làm gốc và đó là nơi bạn cần quyền root. Tất cả fakeroot làm là để biến điều này thành có thể. Nó cho phép danh sách đóng gói A được sở hữu bởi root cho người 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 A như sở hữu của root.

49
Shahbaz

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ắt:

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

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

33
herbalessence

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, 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 đến 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.

11
Dysaster

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.

3
Eero Ketonen

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.

1
jdmayfield

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

1
gabrielhidasy