Qual é a necessidade do comando `fakeroot` no linux

93

Por que precisamos de fakerootcomando? Não podemos simplesmente usar os comandos sudoou su?

A página do manual diz:

fakeroot - executa um comando em um ambiente, falsificando privilégios de root para manipulação de arquivos

About.com diz:

Dá um ambiente raiz falso. Este pacote visa habilitar algo como: dpkg-buildpackage -rfakerootou seja, remover a necessidade de se tornar root para uma compilação de pacotes. Isto é feito através da criação LD_PRELOADde libfakeroot.so, que fornece invólucros em torno getuid, chown, chmod, mknod, stat, ..., criando assim um ambiente de raiz falso. Se você não entende nada disso, não precisa fakeroot!

Minha pergunta é: que finalidade especial resolve isso de maneira simples suou sudonão? Por exemplo, para reembalar todos os pacotes instalados no ubuntu, damos o seguinte comando:

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

Podemos executar o comando acima com sudo ou su em vez de fakeroot desta maneira:

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

EDITAR:

Corrida:

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

me dá este erro:

o diretório de controle tem permissões incorretas 700 (deve ser> = 0755 e <= 0775)

Alguma razão para isso?

gkt
fonte
6
é uma boa idéia, por razões de segurança, evitar fazer como root tudo o que poderia ser feito como usuário normal, mesmo que você possa executar sudoou suporque é sua máquina. fakeroottem dois usos 1) engana os programas a acreditar que você é realmente usuário root, o que algum software proprietário mal escrito pode exigir, mesmo que não seja necessário (geralmente o desenvolvedor do Windows usa o Linux) e 2) permite emular o modo de arquivo e as alterações de propriedade que você não faria ' caso contrário, será capaz de fazer, principalmente para criar um tararquivo com permissões e propriedade corretas, útil, por exemplo, ao empacotar software.
Pqnet
1
Eu acho que a nota no trecho do About.com resume: Se você não entende nada disso, não precisa fakeroot! Se você não consegue pensar em uma situação em que fakerooté útil, literalmente não precisa dela. Mas as pessoas que realmente precisam dele compreendem completamente o caso de uso.
Christopher Schultz

Respostas:

69

Imagine que você é um desenvolvedor / mantenedor de pacotes, etc., trabalhando em um servidor remoto. Você deseja atualizar o conteúdo de um pacote e reconstruí-lo, fazer o download e personalizar um kernel do kernel.org e compilá-lo etc. Ao tentar fazer essas coisas, você descobrirá que algumas etapas requerem rootdireitos ( UIDe GID0) por diferentes razões (segurança, permissões ignoradas, etc.). Mas não é possível obter rootdireitos, pois você está trabalhando em uma máquina remota (e muitos outros usuários têm o mesmo problema que você). É exatamente fakerootisso: finge um efetivo UIDe GID0 para o ambiente que os requer.

Na prática, você nunca obtém rootprivilégios reais (ao contrário sue sudomencionados).

sakisk
fonte
então, eu não posso usar fakerootpara alterar as configurações do sistema? Porque o comando que executaremos achará que está executando como root e fará o que quisermos. não é?
Mrid 28/10/19
3
@mrid Observe o "Na prática, você nunca obtém privilégios de root reais". Então a resposta é não
sakisk 28/10
53

Para ver claramente a diferença entre fakeroot e um verdadeiro sudo / su, basta:

$ 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

Enquanto você estiver no shell fakeroot, parece que você é root - desde que você não tente fazer nada que realmente precise de privilégios de root. E é exatamente isso que uma ferramenta de empacotamento precisa para criar pacotes que farão sentido em qualquer máquina.

De fato, quando você usa o fakeroot para empacotamento, o que você deseja alcançar é tornar as ferramentas executadas no fakeroot para ver seus arquivos pertencentes ao root. Nada mais nada menos. Portanto, su ou sudo não funcionará para obter a propriedade correta do arquivo.

MortenSickel
fonte
O falsificador não é perigoso? Se eu criar um arquivo com o suid bit e rx perm, o arquivo será criado pertencente ao root, executável por qualquer pessoa, como root! Ou talvez definir o suid bit não funcione?
Frizlab
7
Nada de bom. Eu tentei isso sozinho. O principal motivo para o fakeroot é obter propriedade root: root em pacotes criados sem realmente ser root. pacotes instalados terão permissões adequadas, no entanto.
hanetzer
2
Foi tudo muito confuso até eu ler o comentário de @ ntzrmtthihu777!
Shahbaz 07/01
Desculpe, eu não entendo a descrição. Por que não aplicar um patch nas ferramentas para que elas não se queixem se você não for root? Como uma questão relacionada: Afinal, os arquivos que você criar sob fakeroot não são realmente de propriedade do root. Isso não implica que, quando eu instalo esse .debarquivo, todos os meus /usrarquivos pertencem a quem o chamou fakeroot?
Johannes Schaub - litb 12/10
@ JohannesSchaub-litb, não, esse é o ponto. Os arquivos não são de propriedade do root, mas dentro de um fakerootshell, eles parecem ser . Quando o pacote .deb é criado dentro desse shell, o proprietário do arquivo é lido no sistema de arquivos (que fakerootintercepta e retorna root) e armazenado no pacote. Ao instalar o pacote, o dpkg requer acesso root porque o pacote indica que o arquivo deve pertencer à raiz.
Shahbaz
45

Como as respostas são difíceis de entender (para mim) e foram necessárias algumas considerações para entender ( esse comentário me fez entender), vou dar uma explicação esperançosamente melhor.

1. O que acontece no fakeroot

Nada além do que acontece com seu próprio usuário. Absolutamente nada mais. Se você fakeroot(que quando chamado lhe der um novo shell, como sudofaria), fingir fazer coisas pelas quais você precisava de permissão e sair, absolutamente nada aconteceria.

Se você pensar bem, é uma total perda de tempo. Por que você faria coisas que realmente não vão acontecer? É insano. Você poderia simplesmente não ter feito nada disso e não haveria diferença, pois não há vestígios.

Espere um minuto...

2. O traço de fakeroot

Não poderia ser um traço deixado de fakeroot. Vejamos os comandos na resposta de MortenSickel, que são bastante agradáveis ​​e merecem uma votação:

$ 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

À primeira vista, parece que o uso fakerootfoi uma total perda de tempo. No final, se você não tivesse usado fakeroot, teria a mesma coisa.

A coisa sutil aqui é esta:

$ cat root.tst
Wow I have root access

O que significa que o conteúdo do arquivo ainda se lembra de ser uma raiz. Você pode dizer que não usar fakerootteria produzido os mesmos resultados. Você está certo, este exemplo é muito simples.

Vamos dar outro exemplo:

$ 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

Vamos ver o que aconteceu. Eu fingi ser root, o que é totalmente ineficaz, e criei xe y. Eu fingi xpertencer myusere ypertencer a root. Eles realmente pertencem a myuser(como podemos ver no final), mas eu apenas fingi que era assim.

Então eu criei uma lista e salvei minha imaginação em um arquivo. Mais tarde, quando olho para o arquivo, vejo quem imaginei que os arquivos deveriam pertencer. Novamente, eles não são de propriedade de pessoas que imaginei, simplesmente imaginei isso.

3. Então ... Por que você quer isso de novo?

Você pode dizer que eu realmente não precisava fingir ser root para criar essa listagem. Eu poderia simplesmente criar a listagem e editá-la para refletir minha imaginação. Você está certo, você não precisava fakerootdisso. De fato, sabendo que fakerootrealmente não faz nada, você não pode ter adquirido nenhuma habilidade que não possuía antes.

Mas , e é disso que fakerootse trata, editar a listagem pode não ser trivial. Como acontece com um pacote que pode ser instalado no seu sistema, você tem um tared, gziped, xzed, bzip2ed ou qualquer outro formato que mantenha seus arquivos juntos e lembre-se de suas permissões e proprietários. Você pode modificar facilmente o arquivo compactado e editar a propriedade de um arquivo? Não sei você, mas não consigo pensar em uma maneira.

Poderia haver uma ferramenta criada que, depois que tudo é compactado, modifica o arquivo compactado e edita programaticamente as propriedades e permissões? Sim, poderia. Portanto, você pode falsificar as propriedades antes da compactação ou alterá-las depois. O pessoal do Debian decidiu que o primeiro é mais fácil.

4. Por que não usar sudo?

Primeiro de tudo, você não precisa de privilégios de root para criar software e não precisa de privilégios de root para compactá-los. Portanto, se você não precisar, seria realmente um usuário do Windows para conseguir obter essa permissão. Mas sarcasmo à parte, você pode até não ter senha de root.

Além disso, digamos que você tenha permissões de root. E digamos que você queira fingir que um arquivo deve ter acesso de leitura apenas à raiz. Então sudo, você realmente muda o proprietário e as permissões do arquivo para root, sai do shell raiz e tenta empacotar tudo. Você falhou porque agora não pode mais ler o arquivo, pois não possui acesso root. Então você precisa sudocompactar e compilar o pacote como root. Efetivamente, você precisa fazer tudo como raiz.

Esta é a TM ruim .

Como empacotador, você não precisa de permissões de root e não deve obtê-lo. Quando você instala um pacote, pode ser necessário instalar algum arquivo ( A) como root e é aí que você precisa de permissões de root. Tudo o que fakerootfaz é tornar isso possível. Ele permite que o empacotador liste Acomo pertencente à raiz do arquivador, de modo que, quando o pacote é descompactado pelo usuário, o arquivador exige permissão de raiz e cria Acomo pertencente à raiz.

Shahbaz
fonte
5
Excelente redação, isso deixa claro.
Christian Long
1
So either you could fake the ownerships before compressing, or change them after. Debian people decided the former is easier.Isso me ajudou enquanto eu pensava 'por que não modificá-lo depois?'.
Aaaaaa
1
Obrigado, isso esclarece a confusão que eu tive depois de ler a resposta de @ Morten
Johannes Schaub - litb 12/12/18
33

AFAIK, fakeroot executa um comando em um ambiente em que parece ter privilégios de root para manipulação de arquivos. Isso é útil para permitir que os usuários criem arquivos (tar, ar, .deb etc.) com arquivos neles com permissões / propriedade raiz. Sem o fakeroot, seria necessário ter privilégios de root para criar os arquivos constituintes dos arquivos com as permissões e a propriedade corretas e depois empacotá-los, ou seria necessário construir os arquivos diretamente, sem usar o arquivador.

O fakeroot funciona substituindo as funções da biblioteca de manipulação de arquivos (chmod (), stat () etc.) por outras que simulam o efeito que as funções reais da biblioteca teriam, se o usuário realmente fosse root.

Sinopse:

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

Confira mais aqui: fakeroot


fonte
@MaskTheSmokin: Então o fakeroot oferece a você super poder de usuário apenas para operações de manipulação de arquivos, certo.
gkt
@ gkt.pro: Eu acho que sim.
10
Realmente não dá poder ao superusuário, apenas o finge - o programa em execução acha que possui privilégios de root, enquanto ainda usa os privilégios normais do usuário.
Pa Elo Ebermann
2
Onde está a diferença entre the program running in it thinks it has root privilegese o programa ter privilégios de root? Se eu puder fazer um rm -rf /eo programa, executá-lo pensa que eu tenho privilégios de root ...
usuário desconhecido
10
@userunknown Você pode ignorar rma verificação de que possui permissões suficientes, mas o próprio kernel não o deixou; a unlinkchamada do sistema falharia. Não cabe apenas ao aplicativo manipular permissões, ou você poderá escrever seu próprio aplicativo que não verifica as permissões e faz o que quiser com ele
Michael Mrozek
11

Eu o usei para scripts de criação de pacotes. Eu não tinha certeza de que a pessoa que executava o script tem acesso no nível da raiz, mas o script ainda precisava gerar, digamos, um arquivo tar que continha arquivos que pertencem à raiz. A maneira mais simples de fazer isso era executar o script de criação de pacotes no fakeroot, o que levou o arquivador a acreditar que os arquivos pertencem ao root e os empacotou como tal dentro do arquivo. Dessa forma, quando o pacote foi descompactado na máquina de destino (em uma máquina completamente diferente), os arquivos não pertenciam a usuários estranhos ou inexistentes.

Pensando nisso, o único lugar que vi foi para a criação de algum tipo de arquivo: rootfs de sistemas embarcados, arquivos tar.gz, pacotes rpm, pacotes .deb, etc.


fonte
1
fakerooté uma ferramenta de solução alternativa para o software de empacotamento com erros: não há motivo para você ser root para criar esses pacotes, mas como eles não permitem que você especifique permissões de arquivo de nenhuma outra maneira além de configurá-las diretamente no sistema de arquivos anteriormente, você não tem escolha
pqnet 12/08
3

Um uso comum é descobrir quais arquivos um binário com falha realmente queria acessar. Ou seja, descobrir e corrigir ou solucionar problemas causados ​​por caminhos codificados e tratamento inadequado de exceções.

Eero Ketonen
fonte
1

Você pode usar o fakeroot sem ter privilégios de root. Se você tivesse sue / ou sudoseria capaz de destruir seu sistema com um simples rm -rf /, mas com o fakeroot no máximo, você removeria seu diretório pessoal.

gabrielhidasy
fonte
2
Isso não explica a necessidade fakeroot. Você pode remover seu diretório pessoal como você mesmo.
JMCF125
1

A resposta simples:

su e sudo executam comandos como root. fakeroot não, fora do seu arranjo parcial de sandbox.

jdmayfield
fonte