¿Cuál es la necesidad del comando `fakeroot` en Linux?


93

¿Por qué necesitamos fakerootcomando en absoluto? ¿No podemos simplemente usar los comandos sudoo su?

La página del manual dice:

fakeroot: ejecuta un comando en un entorno que simula privilegios de root para la manipulación de archivos

About.com dice:

Da un entorno raíz falso. Este paquete está destinado a habilitar algo como: dpkg-buildpackage -rfakerootes decir, eliminar la necesidad de convertirse en root para la construcción de un paquete. Esto se hace mediante el establecimiento LD_PRELOADde libfakeroot.so, que proporciona envolturas alrededor getuid, chown, chmod, mknod, stat, ..., creando así un entorno raíz falsa. Si no comprende nada de esto, ¡no lo necesita fakeroot!

Mi pregunta es, ¿qué propósito especial resuelve eso simple suo sudono? Por ejemplo, para reempaquetar todos los paquetes instalados en ubuntu, le damos el siguiente comando:

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

¿Podemos hacer el comando anterior con sudo o su en lugar de fakeroot como este:

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

EDITAR:

Corriendo:

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

me da este error:

el directorio de control tiene malos permisos 700 (debe ser> = 0755 y <= 0775)

¿Alguna razón por qué?


66
Es una buena idea, por razones de seguridad, evitar hacer como root todo lo que se podría hacer como usuario normal, incluso si puede ejecutarlo sudoo suporque es su máquina. fakeroottiene dos usos: 1) engaña a los programas haciéndole creer que es un usuario root, lo que puede requerir algún software propietario mal escrito, incluso si no es necesario (por lo general, el desarrollador de Windows se ha convertido en Linux) y 2) permite emular el modo de archivo y los cambios de propiedad que no haría De lo contrario, no podrá hacerlo, principalmente para crear un tararchivo con los permisos y la propiedad correctos, útil, por ejemplo, al empaquetar software.
pqnet

1
Creo que la nota en el extracto de About.com lo resume: si no comprende nada de esto, ¡no lo necesita fakeroot! Si no puede pensar en una situación en la que fakerootsea ​​útil, literalmente no la necesita. Pero las personas que de hecho lo necesitan entienden completamente el caso de uso.
Christopher Schultz

Respuestas:


69

Imagine que es un desarrollador / mantenedor de paquetes, etc. que trabaja en un servidor remoto. Desea actualizar el contenido de un paquete y reconstruirlo, descargar y personalizar un kernel desde kernel.org y compilarlo, etc. Al intentar hacer esas cosas, descubrirá que algunos pasos requieren que tenga rootderechos ( UIDy GID0) por diferentes razones (seguridad, permisos pasados ​​por alto, etc.). Pero no es posible obtener rootderechos, ya que está trabajando en una máquina remota (y muchos otros usuarios tienen el mismo problema que usted). Esto es exactamente lo que fakeroothace: pretende un efectivo UIDy GIDde 0 al entorno que lo requiere.

En la práctica nunca obtienes rootprivilegios reales (al contrario suy sudoque mencionas).


Entonces, ¿no puedo usar fakerootpara cambiar la configuración del sistema? Porque el comando que ejecutaremos pensará que se está ejecutando como root y hará lo que queramos que haga. ¿no es así?
mrid

3
@mrid Tenga en cuenta que "en la práctica nunca obtiene privilegios de root reales". Así que la respuesta es no
sakisk

53

Para ver claramente la diferencia entre fakeroot y un sudo / su real, simplemente haga:

$ 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

Mientras esté dentro del shell fakeroot, parece que es root, siempre y cuando no intente hacer nada que realmente necesite privilegios de root. Y esto es exactamente lo que necesita una herramienta de empaque para hacer paquetes que tengan sentido en cualquier máquina.

De hecho, cuando usa fakeroot para empaquetar, lo que quiere lograr es hacer que las herramientas que ejecuta bajo fakeroot vean sus archivos como propiedad de root. Nada más y nada menos. De hecho, su o sudo no funcionará para obtener la propiedad correcta del archivo.


¿No es peligroso el falso? Si creo un archivo con el bit suid y la permanente rx, el archivo se creará propiedad de root, ejecutable por cualquiera, ¡como root! ¿O tal vez configurar el bit suid no funcionará?
Frizlab

77
No es bueno. Probé esto yo mismo. La razón principal de fakeroot es obtener la propiedad root: root en paquetes integrados sin ser realmente root. Sin embargo, los paquetes instalados tendrán permisos permanentes.
hanetzer

2
¡Todo fue muy confuso hasta que leí el comentario de @ ntzrmtthihu777!
Shahbaz

Lo siento, no entiendo la descripción. ¿Por qué no parchear las herramientas para que no se quejen si no eres root? Como pregunta relacionada: Después de todo, los archivos que se crean bajo fakeroot no son en realidad propiedad de root. ¿No implicaría esto que cuando instalo un .debarchivo de este tipo, todos mis /usrarchivos pertenecen a quien sea que llame el usuario fakeroot?
Johannes Schaub - litb

@ JohannesSchaub-litb, no, ese es el punto. Los archivos no son propiedad de root, pero dentro de un fakerootshell, parecen ser. Cuando se crea el paquete .deb dentro de este shell, el propietario del archivo se lee del sistema de archivos (que fakerootintercepta y devuelve root) y se almacena en el paquete. Al instalar el paquete, dpkg requiere acceso de root porque el paquete indica que el archivo debe ser propiedad de root.
Shahbaz

45

Dado que las respuestas son difíciles de entender (para mí mismo) y me tomó un poco de tiempo entenderlo ( este comentario me hizo entenderlo), voy a dar una explicación con suerte mejor.

1. Lo que sucede en fakeroot

Nada más que lo que sucede con tu propio usuario. Absolutamente nada más. Si usted fakeroot(que cuando se le llama le da un nuevo shell, como lo sudoharía), simule hacer cosas para las que necesitaba permiso y salga, no pasará absolutamente nada.

Si lo piensas, es una pérdida de tiempo total. ¿Por qué harías cosas que en realidad no sucederán? Es una locura. Simplemente podría no haber hecho nada de eso y no habría habido diferencia, ya que no hay rastro de ello.

Espera un minuto...

2. El rastro de fakeroot

No podía ser una huella dejada de fakeroot. Veamos los comandos en la respuesta de MortenSickel, que es bastante agradable y merece un voto positivo:

$ 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 primera vista, parece que haberlo usado fakerootfue una pérdida total de tiempo. Al final, si no lo hubiera usado fakeroot, habría obtenido lo mismo.

Lo sutil aquí es esto:

$ cat root.tst
Wow I have root access

Lo que significa que el contenido del archivo todavía recuerda ser una raíz. Se podría decir que no usar fakeroothabría producido los mismos resultados. Tienes razón, este ejemplo es demasiado simple.

Tomemos otro ejemplo:

$ 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 a ver que pasó. Fingí serlo root, lo cual es totalmente ineficaz, y creé xy y. Fingí xpertenecer myusery ypertenecer root. En realidad, ambos pertenecen myuser(como podemos ver al final), pero solo fingí que era así.

Luego creé una lista y guardé mi imaginación en un archivo. Más tarde, cuando miro hacia atrás en el archivo, puedo ver a quién imaginé que deberían pertenecer los archivos. Una vez más, en realidad no son propiedad de personas que imaginé, simplemente lo imaginé.

3. Entonces ... ¿Por qué quieres eso otra vez?

Puede decir que realmente no necesitaba fingir ser root para crear esa lista. Podría simplemente haber creado el listado, luego editarlo para reflejar mi imaginación. Tienes razón, no necesitabas fakerooteso. De hecho, sabiendo que en fakerootrealidad no hace nada, no puedes haber ganado ninguna habilidad que no tenías antes.

Pero , y esto es de lo que fakerootse trata, editar la lista podría no ser trivial. Como ocurre con un paquete que se puede instalar en su sistema, tiene un formato tared, gziped, xzed, bzip2ed o cualquier otro formato que mantenga sus archivos juntos y recuerde sus permisos y propietarios. ¿Puede modificar fácilmente el archivo comprimido y editar la propiedad de un archivo? No sé sobre ti, pero no puedo pensar en una manera.

¿Podría haber una herramienta construida que, una vez que todo esté comprimido, modifique el archivo comprimido y edite programáticamente las propiedades y los permisos? Sí, podría. Entonces, podría fingir las propiedades antes de comprimirlas o cambiarlas después. La gente de Debian decidió que lo primero es más fácil.

4. ¿Por qué no solo usar sudo?

En primer lugar, no necesita privilegios de root para compilar software y no necesita privilegios de root para comprimirlos. Entonces, si no lo necesita, realmente debería ser un usuario de Windows para pensar en obtener ese permiso. Pero aparte del sarcasmo, es posible que ni siquiera tenga una contraseña de root.

Además, digamos que tienes permisos de root. Y supongamos que desea simular que un archivo debe tener acceso de lectura solo a la raíz. Entonces sudo, en realidad, cambias el propietario del archivo y los permisos a root, sales del shell raíz e intentas empaquetar todo. Fallas porque ahora ya no puedes leer el archivo ya que no tienes acceso de root. Entonces debe sudocomprimir y compilar el paquete como root. Efectivamente, tienes que hacer todo como root.

Esto es malo TM .

Como empaquetador, no necesita permisos de root y no debería obtenerlo. Cuando instala un paquete, es posible que necesite instalar algún archivo ( A) como root y ahí es donde necesita los permisos de root. Todo lo que fakeroothace es hacer esto posible. Permite que el empaquetador enumere Acomo propiedad de root para el archivador, de modo que cuando el usuario descomprime el paquete, el archivador exige permiso de root y crea Acomo propiedad de root.


55
Excelente redacción, esto lo deja claro.
Christian Long

1
So either you could fake the ownerships before compressing, or change them after. Debian people decided the former is easier.Esto me ayudó mientras pensaba '¿por qué no modificarlo después?'
aaaaaa

1
Gracias, esto aclara la confusión que tuve después de leer la respuesta de @ Morten
Johannes Schaub - litb

33

AFAIK, fakeroot ejecuta un comando en un entorno en el que parece tener privilegios de root para la manipulación de archivos. Esto es útil para permitir a los usuarios crear archivos (tar, ar, .deb, etc.) con archivos en ellos con permisos / propiedad raíz. Sin fakeroot, uno tendría que tener privilegios de root para crear los archivos constitutivos de los archivos con los permisos y la propiedad correctos, y luego empaquetarlos, o uno tendría que construir los archivos directamente, sin usar el archivador.

fakeroot funciona reemplazando las funciones de la biblioteca de manipulación de archivos (chmod (), stat (), etc.) por otras que simulan el efecto que habrían tenido las funciones reales de la biblioteca, si el usuario hubiera sido realmente root.

Sinopsis

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

Compruebe más aquí: fakeroot


@MaskTheSmokin: Entonces fakeroot te da un poder súper de usuario solo para operaciones de manipulación de archivos, correcto.
gkt

@ gkt.pro: supongo que sí.

10
Realmente no le da poder al súper usuario, solo lo falsifica: el programa que se ejecuta en él cree que tiene privilegios de root, mientras que realmente todavía usa los privilegios normales del usuario.
Paŭlo Ebermann

2
¿Dónde está la diferencia entre the program running in it thinks it has root privilegesy el programa que tiene privilegios de root? Si puedo hacer un rm -rf /y el programa, ejecutarlo piensa que tengo privilegios de root ...
usuario desconocido

10
@userunknown Es posible que pueda omitir rmla verificación de que tiene permisos suficientes, pero el núcleo en sí mismo no le permite hacerlo; la unlinkllamada al sistema fallaría. No depende solo de la aplicación manejar los permisos, o podría escribir su propia aplicación que no verifique los permisos y haga lo que quiera con ella
Michael Mrozek

11

Lo he usado para crear scripts de paquetes. No estaba seguro de que la persona que ejecuta el script tenga acceso a nivel raíz, pero el script aún necesitaba generar, por ejemplo, un archivo tar que contuviera archivos que pertenecieran a root. La forma más sencilla de hacerlo fue ejecutar el script de creación de paquetes en fakeroot, que engañó al archivero para que creyera que los archivos pertenecen a la raíz, y los empaquetó como tal dentro del archivo. De esta manera, cuando el paquete se descomprimió en la máquina de destino (en una máquina completamente diferente), los archivos no pertenecían a usuarios extraños o inexistentes.

Pensando en ello, el único lugar que he visto fue para construir algún tipo de archivo: rootfs de sistemas integrados, archivos tar.gz, paquetes rpm, paquetes .deb, etc.


1
fakerootes una herramienta alternativa para el software de empaque con errores: no hay ninguna razón por la que deba ser root para crear dichos paquetes, pero dado que no le permiten especificar permisos de archivos de otra manera que no sea configurarlos directamente en el sistema de archivos antes de que no tenga elección
pqnet

3

Un uso común es averiguar a qué archivos realmente quería acceder un binario que fallaba. Es decir, descubrir y corregir o solucionar errores causados ​​por rutas codificadas y manejo inadecuado de excepciones.


1

Puede usar fakeroot sin tener privilegios de root. Si tuviera suy / o sudopudiera destruir su sistema de una manera simple rm -rf /, pero con fakeroot como máximo, eliminaría su directorio de inicio.


2
Eso no explica la necesidad de hacerlo fakeroot. Puede eliminar su directorio personal como usted mismo.
JMCF125

1

La respuesta simple:

su y sudo ejecutan comandos como root. fakeroot no, fuera de su disposición de caja de arena parcial.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.