GNU/Linux >> Tutoriales Linux >  >> Linux

¿Qué tan grande (en bits) es un UID de Unix?

Solución 1:

Tendrás que buscar en <limits.h> (o uno de los archivos que incluye, por ejemplo, sys/syslimits.h en OS X) para el #define de UID_MAX .

Los sistemas operativos más recientes (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) pueden manejar hasta dos mil millones (2^31-2 ), por lo que asumiría eso y haría una solución para los sistemas más oscuros que no lo hacen.

Solución 2:

glibc proporciona definiciones para todos esos tipos de sistemas.

Puedes marcar /usr/include/bits/typesizes.h :

% grep UID_T /usr/include/bits/typesizes.h
#define __UID_T_TYPE            __U32_TYPE

A continuación, mira en /usr/include/bits/types.h :

% grep '#define __U32_TYPE' /usr/include/bits/types.h
#define __U32_TYPE              unsigned int

Esto le permite averiguar el tipo C. Dado que necesita el tamaño en bytes, su mejor opción es analizar el nombre typedef según la especificación en types.h :

We define __S<SIZE>_TYPE and __U<SIZE>_TYPE for the signed and unsigned
variants of each of the following integer types on this machine.

 16      -- "natural" 16-bit type (always short)
 32      -- "natural" 32-bit type (always int)
 64      -- "natural" 64-bit type (long or long long)
 LONG32      -- 32-bit type, traditionally long
 QUAD        -- 64-bit type, always long long
 WORD        -- natural type of __WORDSIZE bits (int or long)
 LONGWORD    -- type of __WORDSIZE bits, traditionally long

Entonces, aquí hay una sola línea:

% grep '#define __UID_T_TYPE' /usr/include/bits/typesizes.h | cut -f 3 | sed -r 's/__([US])([^_]*)_.*/\1 \2/'
U 32

Aquí U significa unsigned (esto también puede ser S para signed ) y 32 es el tamaño (búsquelo en la lista anterior; creo que, la mayoría de las veces, puede suponer que ese ya es el tamaño en bytes, pero si desea que su secuencia de comandos sea completamente portátil, sería mejor hacer case active este valor).

Solución 3:

En este enlace se hace la pregunta y un respondedor usa un método de prueba y error para determinar que el sistema en cuestión usa un int largo con signo, dejando 31 bits para almacenar el valor, con un máximo de 2,147,483,647.

# groupadd -g 42949672950 testgrp
# more /etc/group
testgrp:*:2147483647:

Solución 4:

Esa es una pregunta interesante. Me sorprendería si hubiera un método portátil estándar para determinar esto.

No tengo una caja de Linux a mano, pero el id el comando en FreeBSD 8.0 vuelve a cero:

# id 4294967296
uid=0(root) gid=0(wheel) groups=0(wheel),5(operator)

Estoy seguro de que este es un comportamiento indefinido, pero apostaría a que la mayoría de las versiones de id se ajustaría a cero con 65'536 (si es UID de 16 bits) y 4'294'967'296 o error si superó el límite del sistema.


Linux
  1. ¿Qué tan grande es el amortiguador de tubería?

  2. ¿Cómo alertar sobre la finalización de una tarea larga a través de Ssh?

  3. Linux:¿cómo mostrar el mensaje de bienvenida en Unix?

  4. Cómo cambiar UID o GID de forma segura en Linux

  5. Cómo enumerar los puertos abiertos en el servidor Linux/Unix

Cómo usar el comando grep en Linux/UNIX

Cómo instalar Rclone en Linux y Unix

Cómo configurar la dirección IP estática en Linux y Unix

Cómo convertir un archivo de Windows a un archivo UNIX

¿Cómo eliminar setgid (linux/unix)?

¿Cómo hacer una copia de seguridad a gran escala de Gitlab?