it-swarm.it

Qual è la necessità del comando `fakeroot` in linux

Perché abbiamo bisogno del comando fakeroot? Non possiamo semplicemente usare i comandi Sudo o su?

La pagina man dice:

fakeroot - esegui un comando in un ambiente fingendo i privilegi di root per manipolazione file

About.com dice:

Fornisce un ambiente radice falso. Questo pacchetto ha lo scopo di abilitare qualcosa come: dpkg-buildpackage -rfakeroot vale a dire per rimuovere la necessità di diventare root per un pacchetto compilato. Questo viene fatto impostando LD_PRELOAD per libfakeroot.so, che fornisce wrapper intorno a getuid, chown, chmod, mknod, stat, ..., creando così un falso ambiente di root. Se non capisci nulla di tutto ciò, non hai bisogno di fakeroot!

La mia domanda è: quale scopo speciale risolve un semplice su o Sudo? Ad esempio, per reimballare tutti i pacchetti installati in Ubuntu diamo il seguente comando:

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

Possiamo fare il comando sopra con Sudo o su invece di fakeroot in questo modo:

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

EDIT:

In esecuzione:

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

mi dà questo errore:

la directory di controllo ha autorizzazioni errate 700 (deve essere> = 0755 e <= 0775)

Qualche ragione per cui?

102
gkt

Immagina di essere uno sviluppatore/manutentore di pacchetti, ecc. Che lavori su un server remoto. Vuoi aggiornare il contenuto di un pacchetto e ricostruirlo, scaricare e personalizzare un kernel da kernel.org e costruirlo, ecc. Mentre provi a fare queste cose, scoprirai che alcuni passaggi richiedono che tu abbia root rights (UID e GID 0) per diversi motivi (sicurezza, permessi trascurati, ecc.). Ma non è possibile ottenere root diritti, poiché stai lavorando su una macchina remota (e molti altri utenti hanno lo stesso problema di te). Questo è esattamente ciò che fa fakeroot: finge un efficace UID e GID di 0 all'ambiente che li richiede.

In pratica non si ottengono mai reali root privilegi (al contrario di su e Sudo che menzioni).

70
sakisk

Per vedere chiaramente la differenza tra fakeroot e un vero Sudo/su, basta fare:

$ 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

Finché ti trovi all'interno della shell fakeroot, sembra che tu sia root - purché non provi a fare nulla che abbia davvero bisogno dei privilegi di root. E questo è esattamente ciò di cui uno strumento di imballaggio ha bisogno per rendere i pacchetti che avranno senso su qualsiasi macchina.

In effetti, quando usi fakeroot per il packaging, quello che vuoi ottenere è rendere gli strumenti che esegui con fakeroot per vedere i tuoi file come di proprietà di root. Niente di più, niente di meno. Quindi, infatti, su o Sudo non funzioneranno per ottenere la corretta proprietà del file.

56
MortenSickel

Dal momento che le risposte sono difficili da capire (per me) e ci sono voluti alcuni pensieri per capirlo ( questo commento me lo hanno fatto capire), spero di dare una spiegazione migliore.

1. Cosa succede in fakeroot

Niente di più di quello che succede con il tuo stesso utente. Assolutamente niente di più. Se fakeroot (che quando viene chiamato ti dà una nuova Shell, come farebbe Sudo), fai finta di fare cose per le quali hai bisogno dell'autorizzazione ed esci, non succederebbe assolutamente nulla.

Se ci pensate, è una totale perdita di tempo. Perché dovresti fare cose che in realtà non accadranno? È da pazzi. Non avresti potuto semplicemente non fare nulla e non ci sarebbe stata alcuna differenza, dal momento che non ne esiste traccia.

Apetta un minuto...

2. La traccia di fakeroot

C'è potrebbe lasciare una traccia di fakeroot. Diamo un'occhiata ai comandi in la risposta di MortenSickel che è piuttosto carino e merita un voto:

$ 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

A prima vista, sembra che aver usato fakeroot sia stata una totale perdita di tempo. Alla fine, se non avessi usato fakeroot, avresti ottenuto la stessa cosa.

La cosa sottile qui è questa:

$ cat root.tst
Wow I have root access

Ciò significa che il contenuto del file ricorda ancora di essere un root. Potresti dire che non usare fakeroot avrebbe prodotto gli stessi risultati. Hai ragione, questo esempio è troppo semplice.

Facciamo un altro esempio:

$ 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

Vediamo cosa è successo. Ho fatto finta di essere root, che è totalmente inefficace, e ho creato x e y. Ho fatto finta che x appartenesse a myuser e y appartenesse a root. In realtà entrambi appartengono a myuser (come possiamo vedere alla fine), ma ho solo preteso che sia così.

Quindi ho creato un elenco e salvato la mia immaginazione in un file. Più tardi, quando guardo indietro al file, posso vedere da chi ho immaginato che i file dovrebbero essere di proprietà. Ancora una volta, in realtà non sono di proprietà di persone che immaginavo, l'ho semplicemente immaginato.

3. Quindi ... Perché lo vuoi di nuovo?

Potresti dire che non ho davvero bisogno di fingere di essere root per creare quella lista. Avrei potuto semplicemente creare l'elenco, quindi modificarlo per riflettere la mia immaginazione. Hai ragione, non ti serviva fakeroot per quello. Infatti, sapendo che fakeroot non fa effettivamente nulla, non puoi aver acquisito alcuna abilità che non avevi prima.

Ma , e questo è tutto fakeroot, la modifica della lista potrebbe non essere banale. Come per un pacchetto che può essere installato sul tuo sistema, hai un tar ed, gzip ed, xz ed, bzip2ed o qualsiasi altro formato che tenga uniti i tuoi file e ricordi le loro autorizzazioni e i loro proprietari. Puoi modificare facilmente il file compresso e modificare la proprietà di un file? Non ti conosco, ma non riesco a pensare a un modo.

Potrebbe esserci uno strumento creato che, una volta compresso tutto, modifica il file compresso e modifica a livello di codice le proprietà e le autorizzazioni? Sì, ci potrebbe. Quindi, potresti falsificare le proprietà prima di comprimere o modificarle dopo. Il popolo Debian ha deciso che il primo è più semplice.

4. Perché non usare solo Sudo?

Prima di tutto, non hai bisogno dei privilegi di root per compilare il software e non hai bisogno dei privilegi di root per comprimerli. Quindi, se non ne hai bisogno, dovresti essere davvero un utente di Windows per pensare anche a ottenere quell'autorizzazione. Ma a parte il sarcasmo, potresti non avere nemmeno la password di root.

Inoltre, supponiamo che tu abbia i permessi di root. E supponiamo che tu voglia fingere che un file dovrebbe avere accesso in lettura solo alla radice. Quindi Sudo, in realtà cambi il proprietario del file e le autorizzazioni in root, esci dalla shell di root e provi a impacchettare tutto. Fallisci perché ora non puoi più leggere il file poiché non hai accesso root. Quindi devi Sudo e comprimere e compilare il pacchetto come root. In effetti, devi fare tutto come root.

Questo non va beneTM.

Come packager, non hai bisogno dei permessi di root e non dovresti ottenerlo. Quando si installa un pacchetto, potrebbe essere necessario installare alcuni file (A) come root ed è lì che sono necessari i permessi di root. Tutto fakeroot fa ciò per renderlo possibile. Consente all'elenco dei packager A di proprietà di root per l'archiviatore, in modo che quando il pacchetto viene decompresso dall'utente, l'archiviatore richiede l'autorizzazione di root e crea A come di proprietà di root.

49
Shahbaz

AFAIK, fakeroot esegue un comando in un ambiente in cui sembra avere i privilegi di root per la manipolazione dei file. Ciò è utile per consentire agli utenti di creare archivi (tar, ar, .deb ecc.) Con file al loro interno con permessi/proprietà di root. Senza fakeroot si dovrebbero avere i privilegi di root per creare i file costituenti degli archivi con le autorizzazioni e la proprietà corrette, e quindi impacchettarli, oppure si dovrebbero costruire gli archivi direttamente, senza usare l'archiviatore.

fakeroot funziona sostituendo le funzioni della libreria di manipolazione dei file (chmod (), stat () ecc.) con quelle che simulano l'effetto che avrebbero avuto le reali funzioni della libreria, se l'utente fosse veramente root.

Sinossi:

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

Controlla di più qui: fakeroot

33
herbalessence

L'ho usato per gli script di creazione di pacchetti. Non ero sicuro che la persona che eseguiva lo script avesse accesso a livello di root, ma lo script doveva ancora generare, diciamo, un file tar che contenesse file appartenenti a root. Il modo più semplice per farlo è stato eseguire lo script di creazione del pacchetto in fakeroot, che ha indotto l'archiviatore a credere che i file appartengano a root e li ha impacchettati come tali all'interno dell'archivio. In questo modo, quando il pacchetto è stato decompresso sul computer di destinazione (su un computer completamente diverso), i file non appartenevano a utenti strani o inesistenti.

Pensandoci, l'unico posto in cui ho visto questo è stato per creare una sorta di archivio: rootfs di sistemi embedded, archivi tar.gz, pacchetti rpm, pacchetti .deb, ecc.

11
Dysaster

Un uso comune è quello di scoprire a quali file un binario in errore ha veramente voluto accedere. Cioè, scoprire e correggere o aggirare i bug causati da percorsi codificati e gestione impropria delle eccezioni.

3
Eero Ketonen

La semplice risposta:

su e Sudo eseguono i comandi come root. fakeroot no, al di fuori della sua disposizione parziale sandbox.

1
jdmayfield

Puoi usare fakeroot senza effettivamente avere i privilegi di root. Se avessi su e/o Sudo saresti in grado di distruggere il tuo sistema con un semplice rm -rf /, ma con al massimo fakeroot rimuoveresti la tua home directory.

1
gabrielhidasy