GNU/Linux >> Tutoriels Linux >  >> Linux

Quelle est la taille (en bits) d'un UID Unix ?

Solution 1 :

Vous devrez regarder dans <limits.h> (ou l'un des fichiers qu'il contient, par exemple, sys/syslimits.h sous OS X) pour le #define de UID_MAX .

Les systèmes d'exploitation les plus récents (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) peuvent gérer jusqu'à deux milliards (2^31-2 ), donc je supposerais cela et je ferais une solution de contournement pour les systèmes plus obscurs qui ne le font pas.

Solution 2 :

glibc fournit des définitions pour tous ces types de système.

Vous pouvez vérifier /usr/include/bits/typesizes.h :

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

Ensuite, vous examinez /usr/include/bits/types.h :

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

Cela vous permet de connaître le type C. Puisque vous avez besoin de la taille en octets, votre meilleure option est d'analyser le nom du typedef conformément à la spécification dans 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

Alors, voici une phrase :

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

Ici U signifie unsigned (cela peut aussi être S pour signed ) et 32 est la taille (recherchez-la dans la liste ci-dessus ; je pense que la plupart du temps, vous pouvez supposer que c'est déjà la taille en octets, mais si vous voulez que votre script soit entièrement portable, il serait peut-être préférable de faire case activer cette valeur).

Solution 3 :

Dans ce lien, la question est posée et un répondeur utilise une méthode d'essai et d'erreur pour déterminer que le système en question utilise un entier long signé, laissant 31 bits pour stocker la valeur, avec un maximum de 2 147 483 647.

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

Solution 4 :

C'est une question intéressante. Je serais surpris s'il existait une méthode standard et portable pour déterminer cela.

Je n'ai pas de machine Linux sous la main, mais le id commande sur FreeBSD 8.0 revient à zéro :

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

Je suis sûr que c'est un comportement indéfini, mais je parierais que la plupart des versions de id reviendrait soit à zéro avec 65'536 (si UID 16 bits) et 4'294'967'296 ou une erreur si vous avez dépassé la limite du système.


Linux
  1. Comment alerter à la fin d'une longue tâche sur Ssh ?

  2. UNIX / Linux :Comment supprimer un utilisateur équivalent root (utilisateur non root avec UID 0)

  3. UNIX / Linux :Comment verrouiller ou désactiver un compte utilisateur

  4. Comment fonctionne SSH sans mot de passe sous Linux / UNIX

  5. Comment obtenir le nom de l'utilisateur à partir de l'uid

Comment utiliser la commande grep sous Linux/UNIX

Comment installer Rclone sous Linux et Unix

Comment configurer une adresse IP statique sous Linux et Unix

Comment convertir un fichier Windows en un fichier UNIX

Comment convertir une chaîne en entier sous UNIX

Comment supprimer setgid (linux/unix) ?