linux tipos - Diferencia entre ID de usuario real, ID de usuario efectivo e ID de usuario guardado




bloqueado crear (2)

La distinción entre una identificación de usuario real y una efectiva se realiza porque es posible que tenga la necesidad de tomar temporalmente la identidad de otro usuario (la mayoría de las veces, eso sería root , pero podría ser cualquier usuario). Si solo tiene una ID de usuario, entonces no habría forma de volver a su ID de usuario original después (aparte de dar su palabra por sentado y, en caso de que sea root , usar los privilegios de root para cambiar a cualquier usuario) .

Entonces, la identificación real del usuario es quien realmente eres (el dueño del proceso), y la identificación efectiva del usuario es lo que el sistema operativo busca para tomar una decisión sobre si se te permite o no hacer algo (la mayoría de las veces , hay algunas excepciones).

Cuando inicia sesión, el shell de inicio de sesión establece el ID de usuario real y efectivo con el mismo valor (su ID de usuario real) que el archivo de contraseña.

Ahora, también sucede que ejecuta un programa setuid, y además de ejecutar como otro usuario (por ejemplo, root ), el programa setuid también debe hacer algo en su nombre. ¿Como funciona esto?
Después de ejecutar el programa setuid, tendrá su ID real (ya que usted es el propietario del proceso) y la identificación de usuario efectiva del propietario del archivo (por ejemplo, root ) ya que es setuid.

El programa hace cualquier magia que tenga que ver con los privilegios del superusuario y luego quiere hacer algo en su nombre. Eso significa que intentar hacer algo que no deberías hacer debería fallar . ¿Como hace eso? ¡Bien, obviamente cambiando su identificación de usuario efectiva a la identificación de usuario real!

Ahora ese programa setuid no tiene forma de volver atrás ya que todo lo que el kernel sabe es tu id y ... tu id . Bang, estás muerto.

Esto es para lo que es la ID del usuario del set guardado.

Ya estoy al tanto de la identificación de usuario real. Es el número único para un usuario en el sistema. En mi sistema, Mi uid es

$ echo $UID
1014
$                 

¿Cuáles son las otras dos ID's? Y cuál es el uso de la identificación de usuario efectiva y la identificación de usuario guardada y dónde la usamos en el sistema.


Que es sh

sh (o el lenguaje de comandos de shell) es un lenguaje de programación descrito por el estándar POSIX . Tiene muchas implementaciones ( ksh88 , dash , ...). bash también se puede considerar una implementación de sh (ver más abajo).

Debido a que sh es una especificación, no una implementación, /bin/sh es un enlace simbólico (o un enlace físico) a una implementación real en la mayoría de los sistemas POSIX.

Que es bash

bash comenzó como una implementación compatible con sh (aunque es anterior a la norma POSIX de algunos años), pero con el tiempo ha adquirido muchas extensiones. Muchas de estas extensiones pueden cambiar el comportamiento de los scripts de shell POSIX válidos, por lo que bash no es un shell POSIX válido. Más bien, es un dialecto del lenguaje de shell POSIX.

bash admite un conmutador --posix , lo que lo hace más compatible con POSIX. También intenta imitar POSIX si se invoca como sh .

sh = bash?

Durante mucho tiempo, /bin/sh solía apuntar a /bin/bash en la mayoría de los sistemas GNU / Linux. Como resultado, casi se había vuelto seguro ignorar la diferencia entre los dos. Pero eso comenzó a cambiar recientemente.

Algunos ejemplos populares de sistemas donde /bin/sh no apunta a /bin/bash (y en algunos de los cuales /bin/bash ni siquiera existen) son:

  1. Los sistemas modernos de Debian y Ubuntu, que tienen un enlace simbólico de dash por defecto;
  2. Busybox , que generalmente se ejecuta durante el tiempo de arranque del sistema Linux como parte de initramfs . Utiliza la implementación del shell ash .
  3. BSDs, y en general cualquier sistema que no sea Linux. OpenBSD usa pdksh , un descendiente del shell Korn. Sh de FreeBSD es un descendiente del shell original de UNIX Bourne. Solaris tiene su propio sh que durante mucho tiempo no era compatible con POSIX; una implementación gratuita está disponible desde el proyecto Heirloom .

¿Cómo puedes saber qué puntos /bin/sh apunta en tu sistema?

La complicación es que /bin/sh podría ser un enlace simbólico o un enlace duro. Si es un enlace simbólico, una manera portable de resolverlo es:

% file -h /bin/sh
/bin/sh: symbolic link to bash

Si es un enlace duro, intente

% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash

De hecho, la bandera -L cubre los enlaces simbólicos y los enlaces físicos, pero la desventaja de este método es que no es portátil: POSIX no requiere find para admitir la opción -samefile , aunque tanto GNU find como FreeBSD find lo admiten.

Línea de Shebang

En última instancia, depende de usted decidir cuál usar, escribiendo la línea «shebang».

P.ej

#!/bin/sh

usará sh (y cualquier cosa que suceda para señalar),

#!/bin/bash

usará /bin/bash si está disponible (y falla con un mensaje de error si no lo está). Por supuesto, también puede especificar otra implementación, por ejemplo,

#!/bin/dash

Cual usar

Para mis propios scripts, prefiero sh por las siguientes razones:

  • esta estandarizado
  • Es mucho más simple y fácil de aprender.
  • es portátil en los sistemas POSIX; incluso si no tienen bash , se requiere que tengan sh

Hay ventajas de usar bash también. Sus características hacen que la programación sea más conveniente y similar a la programación en otros lenguajes de programación modernos. Estos incluyen cosas como variables locales de ámbito y matrices. Plain sh es un lenguaje de programación muy minimalista.





linux unix posix