Linux'da “fakeroot” komutuna ihtiyaç nedir?


93

Niçin fakerootkomuta ihtiyacımız var ? Biz sadece kullanılamaz sudoveya sukomutları?

Man sayfa diyor ki:

fakeroot - Bir ortamda, dosya işleme için kök ayrıcalıklara sahip bir komutu çalıştır

About.com diyor ki:

Sahte bir kök ortamı verir. Bu paket, şöyle bir şeyi mümkün kılmak içindir: dpkg-buildpackage -rfakerootyani bir paket oluşturma için kök olma ihtiyacını ortadan kaldırmak. Bu ayar yapılır LD_PRELOADiçin libfakeroot.soetrafında ambalajları sağlar ki, getuid, chown, chmod, mknod, stat, ..., böylece sahte bir kök ortamı yaratır. Bunların hiçbirini anlamıyorsanız, ihtiyacınız yok fakeroot!

Sorum şu ki, ne basit bir amacı çözüyor suya da sudoçözmedi mi? Örneğin, tüm kurulu paketleri ubuntu'da tekrar paketlemek için aşağıdaki komutu veriyoruz:

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

Yukarıdaki komutu şu şekilde fakeroot yerine sudo veya su ile yapabilir miyiz:

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

DÜZENLE:

Koşu:

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

bana bu hatayı veriyor:

kontrol dizini kötü izinlere 700 sahip (>> = 0755 ve <= 0775 olmalı)

Sebebi var mı?


6
Güvenlik nedeniyle, çalıştırabilmeniz sudoveya sumakineniz olduğu için , normal kullanıcı olarak yapılabilecek her şeyi root olarak yapmaktan kaçınmak iyi bir fikirdir . fakerootiki kullanımı vardır 1) programları, sizin gerçekten kötüye kullandığınıza inanmanızı sağlar, bazı kötü yazılmış mülk yazılımlara ihtiyaç duyulmasa bile (genellikle Windows geliştiricisi Linux yaptı) ve 2) ihtiyaç duyacağınız dosya modunu ve mülkiyet değişikliklerini taklit etmeyi gerektirebilir. t Aksi halde tar, örneğin yazılımı paketlerken yararlı olan doğru izinlere ve sahipliğe sahip bir dosya oluşturmak için yapabileceklerdir .
pqnet

1
Bence About.com'dan alıntıdaki not özetliyor: Bunlardan herhangi birini anlamadıysanız, ihtiyacınız yok fakeroot! fakerootYararlı bir durum düşünemiyorsanız, kelimenin tam anlamıyla buna ihtiyacınız yok. Ancak aslında bunu yapan insanlar, kullanım durumunu tamamen anlamalıdır.
Christopher Schultz

Yanıtlar:


69

Uzak bir sunucuda çalışan bir geliştirici / paket koruyucu vb. Olduğunuzu hayal edin. Bunları yapmaya çalışırken bir paketin içeriğini güncelleyip yeniden inşa indirmek ve kernel.org bir çekirdek özelleştirmek ve onu inşa etmek isteyen, vb, bazı adımlar var gerektirir dışarı bulabilirsiniz roothaklarını ( UIDve GID0) farklı nedenlerden dolayı (güvenlik, göz ardı edilmiş izinler, vb.) Ancak rootuzak bir makinede çalıştığınız için haklarınız mümkün değildir (ve diğer birçok kullanıcı da sizinle aynı problemi yaşar). Tam olarak fakerootyaptığı şey budur : Onları gerektiren çevreye etkili UIDve GID0 gibi davranır .

Uygulamada hiçbir zaman gerçek rootayrıcalıklara sahip değilsiniz (aksine suve sudobahsettiğinizin aksine ).


yani, fakerootsistem ayarlarını değiştirmek için kullanamıyorum ? Çünkü çalıştıracağımız komut root olarak çalıştığını düşünecek ve ne yapmak istiyorsak onu yapacağız. değil mi?
mrid

3
@mrid "Uygulamada asla gerçek kök ayrıcalıklarına sahip olamazsınız" not edin. Yani cevap yok
sakisk

53

Fakeroot ile gerçek sudo / su arasındaki farkı açıkça görmek için:

$ 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 kabuğu içinde olduğunuz sürece, kök gibi gözüküyorsunuz - gerçekten kök ayrıcalıklarına ihtiyaç duyan hiçbir şey yapmaya çalışmadığınız sürece. Ve bu tam olarak bir paketleme aracının herhangi bir makinede anlamlı olacak paketleri yapmak için ihtiyaç duyduğu şeydir.

Aslında, paketleme için fakeroot kullandığınızda, elde etmek istediğiniz şey, dosyalarınızı root'a ait olarak görmek için fakeroot altında çalıştırdığınız araçları yapmaktır. Ne fazla ne eksik. Dolayısıyla, su veya sudo, doğru dosya sahipliğini almak için çalışmaz.


Sahte tehlikeli değil mi? Suid bit ve rx perm ile bir dosya oluşturursam, dosya root'a ait, herkes tarafından çalıştırılabilir, root! Ya da belki suid parçasını ayarlamak işe yaramaz mı?
Frizlab

7
İyi değil. Bunu kendim denedim. Sahte kök için temel neden mülkiyet kökünü elde etmektir: kök aslında kök olmadan yerleşik paketlere kök. yüklü paketler yine de uygun izinlere sahip olacak.
hanetzer

2
@ Ntzrmtthihu777'nin yorumunu okuyana kadar hepsi çok kafa karıştırıcıydı!
Shahbaz

Üzgünüm, tanımı anlamıyorum. Neden aletler kullanılmıyorsa, siz kök değilseniz şikayet etmeyecekler? İlgili bir soru olarak: Sonuçta, sahte olarak yarattığınız dosyalar aslında root'a ait değildir . Bu, böyle bir .debdosyayı yüklediğimde , tüm /usrdosyalarımın aradığı kullanıcının sahibi olduğu anlamına gelmez mi fakeroot?
Johannes Schaub - litb

@ JohannesSchaub-litb, hayır mesele bu. Dosyalar kök tarafından sahiplenilmez, ancak bir fakerootkabuğun içinde olduğu gibi görünürler . .Deb paketi bu kabuğun içinde oluşturulduğunda, dosya sahibi dosya sisteminden okunur ( fakerootkesişen ve geri dönen root) ve pakette saklanır. Paketi kurarken, dpkg daha sonra root erişimi gerektirir çünkü paket dosyanın root tarafından sahiplenilmesi gerektiğini belirtir.
Shahbaz

45

Cevapları zor anlamak (kendime) ve bunu anlamak biraz düşünmemi gerektirdi ( bu yorum beni anlamamı sağladı), umarım daha iyi bir açıklama yapacağım.

1. Sahte olarak neler olur?

Kendi kullanıcılarına olanlardan daha fazlası değil Kesinlikle daha fazla bir şey yok. Siz fakeroot(ki dendiğinde size yeni bir kabuk verir sudo) izin için ihtiyacınız olan şeyleri yapıyormuş gibi yapar ve çıkmazsanız kesinlikle hiçbir şey olmaz.

Eğer düşünürseniz, bu tamamen zaman kaybıdır. Neden gerçekleşmeyecek şeyler yapıyorsun? Bu delilik. Bunların hiçbirini yapmamış olabilirdiniz ve hiçbir iz kalmayacağından hiçbir fark olmazdı.

Bir dakika bekle...

2. Sahte kök izi

Kalan bir iz olabilirfakeroot . MortenSickel'in cevabındaki komutlara bir bakalım ki bu oldukça hoş ve bir artığı hak ediyor:

$ 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

İlk bakışta, kullanılmış olması fakeroottam bir zaman kaybı gibi görünüyor . Sonunda, eğer kullanmasaydın fakeroot, aynı şeyi elde ederdin.

Buradaki ince şey şudur:

$ cat root.tst
Wow I have root access

Bu, dosyanın içeriğinin hala bir kök olduğunu hatırlıyor demektir. Kullanmamanın fakerootaynı sonuçları vereceğini söyleyebilirsiniz . Haklısın, bu örnek çok basit.

Başka bir örnek alalım:

$ 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

Ne olduğunu görelim. Ben gibi davrandı roottamamen etkisiz olan ve oluşturulan xve y. Ben davrandı xait olduğu myuserve yait olduğu root. Aslında ikisi de myuser(sonunda görebildiğimiz gibi), ama ben böyle davrandım .

Sonra bir liste oluşturdum ve hayal gücümü bir dosyaya kaydettim. Daha sonra dosyaya geri baktığımda, dosyaların kime ait olduğunu hayal ettiğimi görebiliyorum. Yine, aslında hayal ettiklerime ait değiller, sadece hayal ettim.

3. Peki ... Neden bunu tekrar istiyorsun?

Bu listeyi oluşturmak için root olmama gerekmediğini söyleyebilirsin. Girişi basitçe oluşturabilir, hayal gücümü yansıtacak şekilde düzenleyebilirdim. Haklısın, buna ihtiyacın yoktu fakeroot. Aslında, fakerootbunun aslında hiçbir şey yapmadığını bilmek, daha önce sahip olamadığınız bir yeteneğe sahip olamazsınız.

Ancak , ve fakerootbununla ilgili olan şey, girişi düzenlemek önemsiz olabilir. Sisteminize kurulabilen bir pakette olduğu gibi , dosyalarınızı bir arada tutan ve izinlerini ve sahiplerini hatırlayan bir tared, gziped, xzed, bzip2ed veya başka bir formatınız vardır. Sıkıştırılmış dosyayı kolayca değiştirebilir ve bir dosyanın sahipliğini düzenleyebilir misiniz? Seni bilmiyorum ama bir yol düşünemiyorum.

Her şey sıkıştırıldığında sıkıştırılmış dosyayı değiştiren ve sahiplik ve izinleri programlı olarak düzenleyen bir araç olabilir mi? Evet olabilirdi. Böylece, ya mülkiyeti sıkıştırmadan önce taklit edebilir ya da sonradan değiştirebilirsiniz. Debian halkı eskilerin daha kolay olduğuna karar verdi.

4. Neden sadece kullanmıyorsunuz sudo?

Her şeyden önce, yazılım oluşturmak için kök ayrıcalıklarına ve bunları sıkıştırmak için kök ayrıcalıklarına ihtiyacınız yoktur. Bu yüzden, ihtiyacınız yoksa, bu izni almayı düşünmek için bile gerçekten bir Windows kullanıcısı olmanız gerekir. Ama alaycı bir yana, root şifreniz bile olmayabilir.

Ayrıca diyelim ki kök izinleriniz var. Ve diyelim ki bir dosyanın sadece root'a okuma erişimi olması gerektiği gibi davranmak istediğinizi varsayalım. Böylece sudo, aslında dosya sahibini ve izinlerini değiştiriyor root, kök kabuğundan çıkıp her şeyi paketlemeye çalışıyorsunuz. Başarısızsınız çünkü artık root erişiminiz olmadığı için dosyayı artık okuyamıyorsunuz. Bu yüzden sudopaketi kök olarak sıkıştırmanız ve sıkıştırmanız gerekir . Etkili, her şeyi kök olarak yapmanız gerekiyor.

Bu Kötü TM .

Paketleyici olarak kök izinlerine ihtiyacınız yoktur ve alamazsınız. Bir paketi kurduğunuzda, Aroot ( ) olarak bir dosya ( ) kurmanız gerekebilir ve o zaman root izinlerine ihtiyacınız olacaktır. Bunların hepsi fakerootbunu mümkün kılmaktır. Paketleyici listesinin A, arşivleyici için kök tarafından sahip olduğu şekilde olmasını sağlar, böylece paket kullanıcı tarafından açıldığında, arşivleyici kök izni ister ve root'un Asahip olduğu şekilde oluşturur .


5
Mükemmel yazma, bu açıklığa kavuşturur.
Christian Long,

1
So either you could fake the ownerships before compressing, or change them after. Debian people decided the former is easier.Bu, 'neden sonra değiştirmedim' diye düşünmeye devam ettiğimde bana yardımcı oldu.
aaaaaa

1
Teşekkürler, bu @ Morten'in cevabını okuduktan sonra yaşadığım karışıklığı temizliyor
Johannes Schaub - litb

33

AFAIK, fakeroot, dosya işleme için kök ayrıcalıklara sahip olduğu görünen bir ortamda bir komut çalıştırır. Bu, kullanıcıların kök izinleri / sahipliği olan dosyalarda arşivler (tar, ar, .deb vb.) Oluşturmalarını sağlamak için kullanışlıdır. Sahte bir kök olmadan, arşivlerin kurucu dosyalarını doğru izinlere ve sahipliğe sahip oluşturmak için kök ayrıcalıklarına sahip olmak ve daha sonra bunları paketlemek ya da bir arşivleyiciyi kullanmadan doğrudan arşivleri oluşturmak zorunda kalacaktı.

fakeroot, dosya işleme kütüphane işlevlerini (chmod (), stat () vb.) gerçek kütüphane işlevlerinin sahip olacağı etkiyi simüle edenlerle değiştirerek çalışır.

Özet:

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

Burada daha fazlasını kontrol edin: fakeroot


@MaskTheSmokin: Yani fakeroot, sadece dosya işleme işlemleri için size süper kullanıcı gücü verir, doğru.
gkt

@ gkt.pro: Sanırım evet.

10
Gerçekten süper kullanıcı gücü sağlamaz, sadece sahtedir - içinde çalışan program hala kökten ayrıcalıklara sahip olduğunu düşünürken, yine de kullanıcının normal ayrıcalıklarını kullanır.
Paŭlo Ebermann

2
the program running in it thinks it has root privilegesKök ayrıcalıklarına sahip olan program ile program arasındaki fark nerede ? Bir rm -rf /ve program yapabilirsem, çalıştırma benim kök ayrıcalıklarım olduğunu düşünüyor ...
kullanıcı bilinmeyen

10
@ userunknown rmYeterli izne sahip olduğunuz kontrolünü atlayabilirsiniz , ancak çekirdeğin kendisi bunu yapmanıza izin vermez; unlinksistem çağrısı başarısız olur. İzinleri işlemek tek başına uygulamalara bağlı değildir veya izinleri kontrol etmeyen ve onunla ne istersen yapacak kendi başvurunuzu yazabilirsiniz
Michael Mrozek

11

Paket oluşturma komut dosyaları için kullandım. Komut dosyasını çalıştıran kişinin kök düzeyinde erişime sahip olduğundan emin değildim, ancak komut dosyasının hala köke ait dosyaları içeren bir tar dosyası oluşturması gerekiyordu. Bunu yapmanın en kolay yolu, paket oluşturma komut dosyasını sahte dosya altında çalıştırmaktı, bu da arşivleyiciyi dosyaların kök dizinine ait olduğuna inandırarak kandırdı ve bunları arşivin içine yerleştirdi. Bu şekilde, paket hedef makineye açıldığında (tamamen farklı bir makinede), dosyalar tuhaf veya mevcut olmayan kullanıcılara ait değildir.

Bunu düşündüğümde, bunu gördüğüm tek yer bir çeşit arşiv oluşturmaktı: gömülü sistemlerin kökleri, tar.gz arşivleri, rpm paketleri, .deb paketleri vb.


1
fakerootpaketlenmiş paketleme yazılımı için bir çözüm aracıdır: bu tür paketler oluşturmak için root olmanız için bir neden yoktur, ancak dosya izinlerini doğrudan dosya sistemine belirlemekten başka bir şekilde belirtmenize izin vermediğinden seçim
pqnet

3

Yaygın olarak kullanılan bir kullanım, arızalı bir ikili dosyanın hangi dosyalara erişmek istediğini bulmaktır. Başka bir deyişle, zor kodlanmış yolların ve uygunsuz istisnaların ele alınmasının yol açtığı hataları bulmak ve düzeltmek veya bunları çözmek.


1

Kök ayrıcalıklarına sahip olmadan fakeroot kullanabilirsiniz. Sahip olsaydınız suve / veya sudosisteminizi basit bir şekilde yok edebilecek olsaydınız rm -rf /, ancak en çok sahte olanı kullanarak ana dizininizi kaldırırdınız.


2
Bu ihtiyacı açıklamıyor fakeroot. Giriş dizininizi kendiniz kaldırabilirsiniz.
JMCF125 16:13

1

Basit cevap:

su ve sudo komutlarını root olarak çalıştır. fakeroot, kısmi sandbox düzenlemesinin dışında değildir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.