Apa perlunya perintah `fakeroot` di linux

93

Mengapa kita perlu fakerootperintah sama sekali? Tidak bisa kita hanya menggunakan sudoatau superintah?

Halaman manual mengatakan:

fakeroot - jalankan perintah di lingkungan memalsukan hak root untuk manipulasi file

About.com mengatakan:

Memberikan lingkungan root palsu. Paket ini dimaksudkan untuk mengaktifkan sesuatu seperti: dpkg-buildpackage -rfakerootyaitu untuk menghapus kebutuhan untuk menjadi root untuk membangun paket. Hal ini dilakukan dengan menetapkan LD_PRELOADuntuk libfakeroot.so, yang menyediakan bungkus sekitar getuid, chown, chmod, mknod, stat, ..., sehingga menciptakan lingkungan akar palsu. Jika Anda tidak memahami semua ini, Anda tidak perlu fakeroot!

Pertanyaan saya adalah, tujuan khusus apa yang dipecahkan dengan sederhana suatau sudotidak? Misalnya, untuk mengemas ulang semua paket yang diinstal di ubuntu kami memberikan perintah berikut:

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

Bisakah kita melakukan perintah di atas dengan sudo atau su bukannya fakeroot seperti ini:

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

SUNTING:

Berlari:

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

memberi saya kesalahan ini:

direktori kontrol memiliki izin buruk 700 (harus> = 0755 dan <= 0775)

Ada alasan mengapa

gkt
sumber
6
itu adalah ide yang bagus, untuk alasan keamanan, untuk menghindari melakukan root semua yang dapat dilakukan sebagai pengguna normal, bahkan jika Anda dapat menjalankan sudoatau sukarena itu adalah mesin Anda. fakerootmemiliki dua penggunaan 1) itu membodohi program untuk meyakini bahwa Anda memang pengguna root, yang mungkin memerlukan beberapa perangkat lunak berpemilik yang ditulis dengan buruk bahkan jika tidak diperlukan (biasanya pengembang Windows pergi ke Linux) dan 2) memungkinkan mengemulasi mode file dan perubahan kepemilikan yang tidak Anda inginkan t jika tidak dapat dilakukan, terutama untuk membuat tarfile dengan izin dan kepemilikan yang benar, berguna misalnya saat mengemas perangkat lunak.
pqnet
1
Saya pikir catatan dalam kutipan dari About.com merangkumnya: Jika Anda tidak memahami semua ini, Anda tidak perlu fakeroot! Jika Anda tidak dapat memikirkan situasi di mana fakerootberguna, maka Anda benar-benar tidak membutuhkannya. Tetapi orang-orang yang memang membutuhkannya benar-benar memahami use-case.
Christopher Schultz

Jawaban:

69

Bayangkan Anda adalah pengembang / pengelola paket, dll. Yang bekerja di server jarak jauh. Anda ingin memperbarui konten suatu paket dan membangunnya kembali, mengunduh dan menyesuaikan kernel dari kernel.org dan membuatnya, dll. Ketika mencoba melakukan hal-hal itu, Anda akan menemukan bahwa beberapa langkah mengharuskan Anda memiliki roothak ( UIDdan GID0) karena berbagai alasan (keamanan, izin yang diabaikan, dll). Tetapi tidak mungkin untuk mendapatkan roothak, karena Anda bekerja pada mesin jarak jauh (dan banyak pengguna lain memiliki masalah yang sama dengan Anda). Inilah yang sebenarnya fakerootdilakukan: itu berpura-pura efektif UIDdan GID0 terhadap lingkungan yang menuntut mereka.

Dalam praktiknya Anda tidak pernah mendapatkan roothak istimewa nyata (berlawanan dengan sudan sudoyang Anda sebutkan).

sakisk
sumber
jadi, saya tidak bisa menggunakan fakerootuntuk mengubah pengaturan sistem ?? karena perintah yang akan kita jalankan akan berpikir itu berjalan sebagai root dan melakukan apa pun yang kita inginkan. bukan?
mrid
3
@mrid Perhatikan "Dalam praktiknya Anda tidak pernah mendapatkan hak akses root nyata". Jadi
server
53

Untuk melihat dengan jelas perbedaan antara fakeroot dan sudo / su asli, lakukan saja:

$ 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

Selama Anda berada di dalam shell fakeroot, sepertinya Anda root - selama Anda tidak mencoba melakukan apa pun yang benar-benar membutuhkan privilege root. Dan inilah yang dibutuhkan alat pengemasan untuk membuat paket yang masuk akal pada mesin apa pun.

Bahkan, ketika Anda menggunakan fakeroot untuk kemasan, apa yang ingin Anda capai adalah membuat alat yang Anda jalankan di bawah fakeroot untuk melihat file Anda sebagai milik root. Tidak lebih, tidak kurang. Jadi pada kenyataannya, su atau sudo tidak akan berfungsi untuk mendapatkan kepemilikan file yang tepat.

MortenSickel
sumber
Bukankah faker berbahaya? Jika saya membuat file dengan bit suid dan perm rx, file tersebut akan dibuat dimiliki oleh root, dapat dieksekusi oleh siapa saja, sebagai root! Atau mungkin pengaturan bit suid tidak akan berhasil?
Frizlab
7
Tidak baik. Saya mencoba ini sendiri. Alasan utama fakeroot adalah untuk mendapatkan root kepemilikan: root ke paket-paket yang dibangun tanpa benar-benar menjadi root. paket yang terinstal akan memiliki perms yang tepat.
hanetzer
2
Semuanya sangat membingungkan sampai saya membaca komentar @ ntzrmtthihu777!
Shahbaz
Maaf, saya tidak mengerti uraiannya. Mengapa tidak menambal alat sehingga mereka tidak akan mengeluh jika Anda tidak melakukan root? Sebagai pertanyaan terkait: Bagaimanapun, file yang Anda buat di bawah fakeroot sebenarnya tidak dimiliki oleh root. Bukankah ini menyiratkan bahwa ketika saya menginstal .debfile seperti itu , semua /usrfile saya dimiliki oleh siapa pun pengguna yang dipanggil fakeroot?
Johannes Schaub - litb
@ Johannes Schaub-litb, tidak itu intinya. File-file tersebut tidak dimiliki oleh root, tetapi di dalam fakerootshell, mereka terlihat seperti itu. Ketika paket .deb dibuat di dalam shell ini, pemilik file dibaca dari sistem file (yang fakerootmemotong dan mengembalikan root) dan disimpan dalam paket. Saat menginstal paket, dpkg kemudian memerlukan akses root karena paket menunjukkan file harus dimiliki oleh root.
Shahbaz
45

Karena jawabannya sulit dimengerti (untuk diri saya sendiri) dan butuh pemikiran untuk memahaminya ( komentar ini membuat saya memahaminya), saya akan memberikan penjelasan yang diharapkan lebih baik.

1. Apa yang terjadi di fakeroot

Tidak lebih dari apa yang terjadi dengan pengguna Anda sendiri. Sama sekali tidak lebih. Jika Anda fakeroot(yang ketika dipanggil memberi Anda shell baru, seperti sudoakan), berpura-pura melakukan hal-hal yang Anda perlu izin, dan keluar, sama sekali tidak akan terjadi apa-apa.

Kalau dipikir-pikir, itu buang-buang waktu saja. Mengapa Anda melakukan hal-hal yang sebenarnya tidak akan terjadi? Ini gila. Anda bisa saja tidak melakukan apapun dan tidak akan ada perbedaan, karena tidak ada jejaknya.

Tunggu sebentar...

2. Jejak fakeroot

Ada bisa menjadi jejak kiri fakeroot. Mari kita lihat perintah-perintah dalam jawaban MortenSickel yang cukup bagus dan layak mendapat upvote:

$ 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

Pada pandangan pertama, sepertinya menggunakan fakerootadalah membuang-buang waktu. Pada akhirnya, jika Anda tidak menggunakannya fakeroot, Anda akan mendapatkan hal yang sama.

Hal yang halus di sini adalah ini:

$ cat root.tst
Wow I have root access

Yang berarti konten file masih ingat menjadi root. Anda mungkin mengatakan tidak menggunakan fakerootakan menghasilkan hasil yang sama. Anda benar, contoh ini terlalu sederhana.

Mari kita ambil contoh lain:

$ 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

Mari kita lihat apa yang terjadi. Saya pura-pura root, yang sama sekali tidak efektif, dan dibuat xdan y. Saya berpura x- pura menjadi milik myuserdan ymilik root. Mereka berdua sebenarnya milik myuser(seperti yang bisa kita lihat pada akhirnya), tetapi saya hanya berpura - pura menjadi seperti itu.

Kemudian saya membuat daftar dan menyimpan imajinasi saya ke file. Kemudian ketika saya melihat kembali file tersebut, saya bisa melihat siapa yang saya bayangkan file-file itu seharusnya dimiliki. Sekali lagi, mereka tidak benar-benar dimiliki oleh orang yang saya bayangkan, saya hanya membayangkannya saja.

3. Jadi ... Mengapa Anda menginginkannya lagi?

Anda mungkin mengatakan bahwa saya tidak benar-benar perlu memalsukan root untuk membuat cantuman itu. Saya bisa saja membuat daftar, lalu mengeditnya untuk mencerminkan imajinasi saya. Anda benar, Anda tidak perlu fakerootmelakukannya. Faktanya, mengetahui bahwa fakerootsebenarnya tidak melakukan apa-apa, Anda tidak mungkin memperoleh kemampuan apa pun yang sebelumnya tidak Anda miliki.

Tapi , dan ini yang fakerootpenting, mengedit daftar bisa jadi tidak penting. Seperti halnya dengan paket yang dapat diinstal pada sistem Anda, Anda memiliki tared, gziped, xzed, bzip2ed atau format lain yang menjaga file Anda bersama dan mengingat izin dan pemiliknya. Bisakah Anda dengan mudah memodifikasi file terkompresi dan mengedit kepemilikan file? Saya tidak tahu tentang Anda, tetapi saya tidak bisa memikirkan cara.

Mungkinkah ada alat yang dibangun itu, setelah semuanya dikompresi, ia memodifikasi file yang dikompresi dan secara terprogram mengedit kepemilikan dan izin? Ya ada bisa. Jadi Anda bisa memalsukan kepemilikan sebelum mengompresi, atau mengubahnya setelah. Orang Debian memutuskan yang pertama lebih mudah.

4. Kenapa tidak pakai saja sudo?

Pertama-tama, Anda tidak perlu hak akses root untuk membangun perangkat lunak dan Anda tidak perlu hak akses root untuk mengompresnya. Jadi jika Anda tidak membutuhkannya, Anda harus benar-benar menjadi pengguna Windows untuk berpikir untuk mendapatkan izin itu. Tapi selain sarkasme, Anda bahkan mungkin tidak memiliki kata sandi root.

Selain itu, katakanlah Anda memiliki izin root. Dan katakanlah Anda ingin berpura-pura bahwa file seharusnya memiliki akses hanya baca ke root. Jadi sudo, Anda benar-benar mengubah pemilik file dan izin root, Anda keluar dari shell root dan mencoba untuk mengemas semuanya. Anda gagal karena sekarang Anda tidak dapat membaca file lagi karena Anda tidak memiliki akses root. Jadi, Anda harus sudodan kompres dan membangun paket sebagai root. Secara efektif, Anda harus melakukan semuanya sebagai root.

Ini adalah TM Buruk .

Sebagai seorang pembuat paket, Anda tidak perlu izin root dan Anda seharusnya tidak mendapatkannya. Ketika Anda menginstal sebuah paket, Anda mungkin perlu menginstal beberapa file ( A) sebagai root dan di situlah Anda memerlukan izin root. Yang fakerootdilakukan hanyalah membuat ini menjadi mungkin. Ini memungkinkan daftar pemaket yang Adimiliki oleh root untuk pengarsipan, sehingga ketika paket didekompresi oleh pengguna, pengarsip tersebut meminta izin root dan membuat Asebagai milik root.

Shahbaz
sumber
5
Langgan yang sangat baik, ini membuatnya jelas.
Christian Long
1
So either you could fake the ownerships before compressing, or change them after. Debian people decided the former is easier.Ini membantu saya ketika saya terus berpikir 'mengapa tidak mengubahnya setelah itu?'.
aaaaaa
1
Terima kasih, ini menghilangkan kebingungan yang saya miliki setelah membaca jawaban @ Morten
Johannes Schaub - litb
33

AFAIK, fakeroot menjalankan perintah di lingkungan di mana ia tampaknya memiliki hak akses root untuk manipulasi file. Ini berguna untuk memungkinkan pengguna membuat arsip (tar, ar, .deb, dll.) Dengan file di dalamnya dengan izin / kepemilikan root. Tanpa fakeroot, seseorang perlu memiliki hak akses root untuk membuat file konstituen dari arsip dengan izin dan kepemilikan yang benar, dan kemudian mengemasnya, atau seseorang harus membangun arsip secara langsung, tanpa menggunakan pengarsipan.

fakeroot berfungsi dengan mengganti fungsi pustaka manipulasi file (chmod (), stat () dll) dengan yang mensimulasikan efek fungsi pustaka yang sebenarnya, seandainya pengguna benar-benar menjadi root.

Sinopsis:

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

Periksa lebih lanjut di sini: fakeroot


sumber
@MaskTheSmokin: Jadi fakeroot memberi Anda kekuatan pengguna super hanya untuk operasi manipulasi file, kan.
gkt
@ gkt.pro: Saya kira, ya.
10
Itu tidak benar-benar memberikan kekuatan pengguna super, itu hanya palsu - program yang berjalan di dalamnya berpikir ia memiliki hak akses root, sementara itu benar-benar masih menggunakan hak normal pengguna.
Paŭlo Ebermann
2
Di mana perbedaan antara the program running in it thinks it has root privilegesdan program memiliki hak akses root? Jika saya dapat melakukan rm -rf /dan programnya, menjalankannya mengira saya memiliki hak akses root ...
pengguna tidak diketahui
10
@ penggunaunknown Anda mungkin dapat mem rm- bypass memeriksa apakah Anda memiliki izin yang memadai, tetapi kernel itu sendiri tidak akan membiarkan Anda melakukannya; yang unlinksystem call akan gagal. Tidak tergantung pada aplikasi sendiri untuk menangani izin, atau Anda akan dapat menulis aplikasi Anda sendiri yang tidak memeriksa izin dan melakukan apa pun yang Anda inginkan dengannya
Michael Mrozek
11

Saya telah menggunakannya untuk skrip pembuatan paket. Saya tidak yakin bahwa orang yang menjalankan skrip memiliki akses tingkat root, tetapi skrip masih perlu untuk menghasilkan, katakanlah, file tar yang berisi file-file milik root. Cara paling sederhana untuk melakukannya adalah menjalankan skrip pembuatan paket di bawah fakeroot, yang menipu pengarsipan untuk meyakini bahwa file-file itu milik root, dan mengemasnya seperti itu di dalam arsip. Dengan cara ini, ketika paket itu dibongkar ke mesin tujuan (pada mesin yang berbeda sama sekali), file bukan milik pengguna aneh atau tidak ada.

Berpikir tentang itu, satu-satunya tempat saya telah melihat ini adalah untuk membangun semacam arsip: rootfs dari sistem embedded, arsip tar.gz, paket rpm, paket .deb, dll.


sumber
1
fakerootadalah alat penyelesaian untuk perangkat lunak pengemasan yang disadap: tidak ada alasan Anda perlu melakukan root untuk membuat paket semacam itu, tetapi karena mereka tidak memungkinkan Anda untuk menentukan izin file dengan cara lain selain mengaturnya langsung ke sistem file sebelum Anda tidak memiliki choice
pqnet
3

Salah satu penggunaan umum adalah untuk mencari tahu file apa yang ingin diakses oleh biner yang gagal. Yaitu, mencari tahu dan memperbaiki atau mengatasi bug yang disebabkan oleh jalur berkode keras dan penanganan pengecualian yang tidak benar.

Eero Ketonen
sumber
1

Anda dapat menggunakan fakeroot tanpa benar-benar memiliki hak akses root. Jika Anda memiliki sudan / atau sudoAnda akan dapat menghancurkan sistem Anda dengan sederhana rm -rf /, tetapi dengan fakeroot paling banyak Anda akan menghapus direktori home Anda.

gabrielhidasy
sumber
2
Itu tidak menjelaskan perlunya fakeroot. Anda dapat menghapus direktori home Anda sendiri.
JMCF125
1

Jawaban sederhana:

su dan sudo menjalankan perintah sebagai root. fakeroot tidak, di luar pengaturan sandbox parsial itu.

jdmayfield
sumber