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


93

Perché abbiamo bisogno del fakerootcomando? Non possiamo semplicemente usare i comandi sudoo su?

La pagina man dice:

fakeroot: esegue un comando in un ambiente che finge i privilegi di root per la manipolazione dei file

About.com dice:

Fornisce un ambiente radice falso. Questo pacchetto ha lo scopo di abilitare qualcosa di simile: ad dpkg-buildpackage -rfakerootesempio per rimuovere la necessità di diventare root per la creazione di un pacchetto. Questo viene fatto impostando LD_PRELOADa libfakeroot.so, che fornisce wrapper intorno getuid, chown, chmod, mknod, stat, ..., creando così un ambiente fake root. Se non capisci nulla di tutto ciò, non ti serve fakeroot!

La mia domanda è: quale scopo speciale risolve questo semplice suo sudono? 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`

MODIFICARE:

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?


6
è una buona idea, per motivi di sicurezza, evitare di fare come root tutto ciò che potrebbe essere fatto come utente normale, anche se è possibile eseguirlo sudoo superché è la propria macchina. fakerootha due usi 1) fa credere ai programmi di credere che tu sia davvero un utente root, che alcuni software proprietari scritti male potrebbero richiedere anche se non necessari (di solito lo sviluppatore di Windows è diventato Linux) e 2) consente di emulare la modalità file e i cambiamenti di proprietà che non vorresti altrimenti sarebbe in grado di farlo, principalmente per creare un tarfile con permessi e proprietà corretti, utile ad esempio durante il packaging del software.
pqnet,

1
Penso che la nota nell'estratto di About.com lo riassuma: se non capisci nulla di tutto ciò, non è necessario fakeroot! Se non riesci a pensare a una situazione in cui fakerootè utile, non ne hai letteralmente bisogno. Ma le persone che ne hanno effettivamente bisogno comprendono completamente il caso d'uso.
Christopher Schultz,

Risposte:


69

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 i rootdiritti ( UIDe GID0) per diversi motivi (sicurezza, permessi trascurati, ecc.). Ma non è possibile ottenere i rootdiritti, poiché stai lavorando su una macchina remota (e molti altri utenti hanno lo stesso problema di te). Questo è esattamente ciò che fakerootfa: pretende un efficace UIDe GIDdi 0 per l'ambiente che li richiede.

In pratica non si ottengono mai rootprivilegi reali (al contrario sue sudoche si menziona).


quindi, non posso usare fakerootper modificare le impostazioni di sistema ?? perché il comando che eseguiremo penserà che stia funzionando come root e farà tutto ciò che vogliamo che faccia. no?
mrid,

3
@mrid Nota "In pratica non ottieni mai i privilegi di root reali". Quindi la risposta è no
sakisk,

53

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é sei all'interno della shell fakeroot, sembra che tu sia root - purché non provi a fare qualcosa 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 in fakeroot per vedere i tuoi file come di proprietà di root. Niente di più, niente di meno. Quindi, in effetti, su o sudo non funzioneranno per ottenere la corretta proprietà del file.


Faker non è pericoloso? Se creo un file con il bit di suid e il perm di rx, il file verrà creato di proprietà di root, eseguibile da chiunque, come root! O forse l'impostazione del bit di suid non funzionerà?
Frizlab,

7
Non buono. L'ho provato da solo. Il motivo principale per fakeroot è ottenere il root di proprietà: root nei pacchetti creati senza essere realmente root. i pacchetti installati avranno comunque permessi adeguati.
appendiabiti

2
È stato tutto molto confuso finché non ho letto il commento di @ ntzrmtthihu777!
Shahbaz,

Spiacenti, non capisco la descrizione. Perché non patchare gli strumenti in modo che non si lamentino se non si è root? Come domanda correlata: dopo tutto, i file creati in fakeroot non sono effettivamente di proprietà di root. Ciò non implicherebbe che quando installo un tale .debfile, tutti i miei /usrfile sono di proprietà di chiunque abbia chiamato l'utente fakeroot?
Johannes Schaub - litb

@ JohannesSchaub-litb, no questo è il punto. I file non sono di proprietà di root, ma all'interno di una fakerootshell sembrano essere. Quando il pacchetto .deb viene creato all'interno di questa shell, il proprietario del file viene letto dal file system (che fakerootintercetta e restituisce root) e memorizzato nel pacchetto. Quando si installa il pacchetto, dpkg richiede quindi l'accesso come root poiché il pacchetto indica che il file deve essere di proprietà di root.
Shahbaz,

45

Dal momento che le risposte sono difficili da capire (per me) e ci sono voluti alcuni pensieri per capirlo ( questo commento mi ha 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 tu fakeroot(che quando viene chiamato ti dà una nuova shell, come sudofarebbe), fingi di fare cose per le quali avevi bisogno di autorizzazione, ed esci, non accadrebbe 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

Ci potrebbe essere una traccia sinistra fakeroot. Diamo un'occhiata ai comandi nella risposta di MortenSickel che è piuttosto carina 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 sia fakerootstata 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. Si potrebbe dire che il mancato utilizzo fakerootavrebbe 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 creato xe y. Ho fatto finta xdi appartenere myusere ydi appartenere root. In realtà appartengono entrambi myuser(come possiamo vedere alla fine), ma ho solo fatto finta che fosse 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 immaginavo che i file dovessero 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 ne avevi bisogno fakeroot. In effetti, sapendo che in fakerootrealtà non fa nulla, non puoi aver acquisito alcuna abilità che non avevi prima.

Ma , e questo è fakeroottutto, modificare l'elenco potrebbe non essere banale. Come per un pacchetto che può essere installato sul tuo sistema, hai un tared, gziped, xzed, bzip2ed o qualsiasi altro formato che tenga uniti i tuoi file e ricordi i loro permessi e 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, cambiando effettivamente il proprietario del file e le autorizzazioni root, si esce dalla shell di root e si tenta di impacchettare tutto. Fallisci perché ora non puoi più leggere il file poiché non hai accesso root. Quindi devi sudocomprimere e compilare il pacchetto come root. In effetti, devi fare tutto come root.

Questa è Bad TM .

Come packager, non hai bisogno delle autorizzazioni di root e non dovresti ottenerlo. Quando si installa un pacchetto, potrebbe essere necessario installare alcuni file ( A) come root ed è qui che sono necessari i permessi di root. Tutto ciò che fakerootserve è renderlo possibile. Consente all'elenco dei packager Adi 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 Acome di proprietà di root.


5
Ottima scrittura, questo lo rende chiaro.
Christian Long,

1
So either you could fake the ownerships before compressing, or change them after. Debian people decided the former is easier.Questo mi ha aiutato mentre continuavo a pensare "perché non modificarlo dopo?".
aaaaaa,

1
Grazie, questo chiarisce la confusione che ho avuto dopo aver letto la risposta di @ Morten
Johannes Schaub - litb

33

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


@MaskTheSmokin: Quindi fakeroot ti dà il potere super utente solo per le operazioni di manipolazione dei file, giusto.
gkt,

@ gkt.pro: credo di si.

10
Non dà davvero il potere di superutente, lo finge solo - il programma in esecuzione pensa di avere i privilegi di root, mentre utilizza ancora i normali privilegi dell'utente.
Paŭlo Ebermann,

2
Dov'è la differenza tra the program running in it thinks it has root privilegese il programma ha i privilegi di root? Se riesco a fare un rm -rf /e il programma, eseguendolo penso che io abbia i privilegi di root ...
utente sconosciuto

10
@userunknown Potresti essere in grado di eludere rmil controllo di disporre di autorizzazioni sufficienti, ma il kernel stesso non ti permetterebbe di farlo; la unlinkchiamata di sistema fallirebbe. Gestire le autorizzazioni non dipende solo dall'applicazione, altrimenti potresti scrivere la tua applicazione che non controlla le autorizzazioni e fa quello che vuoi con te
Michael Mrozek

11

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 che appartengono 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 costruire una sorta di archivio: rootfs di sistemi embedded, archivi tar.gz, pacchetti rpm, pacchetti .deb, ecc.


1
fakerootè uno strumento alternativo per software di packaging con errori: non vi è alcun motivo per cui è necessario essere root per creare tali pacchetti, ma poiché non consentono di specificare le autorizzazioni per i file in altro modo che impostarli direttamente nel filesystem prima di non avere scelta
pqnet

3

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 da una gestione impropria delle eccezioni.


1

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


2
Questo non spiega la necessità di fakeroot. Puoi rimuovere la tua home directory come te stesso.
JMCF125,

1

La semplice risposta:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.