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

18

Je comprends que les ID utilisateur Unix (UID) sont généralement des entiers non signés 16 ou 32 bits, mais comment puis-je trouver un système donné (dans un shell)?

Josef
la source

Réponses:

12

Vous devrez rechercher <limits.h>(ou l'un des fichiers qu'il contient, par exemple, sys/syslimits.hsur OS X) pour le #defineof 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 suppose que cela et contourner les systèmes les plus obscurs qui ne 't.

DM.
la source
1
Malheureusement, il n'existe rien de tel UID_MAX. Par exemple, des outils shadow-utilsutilisés (uid_t)-1pour trouver la valeur maximale de l'UID.
kirelagin
5
La plupart des systèmes utilisent /etc/login.defs qui a UID_MAX défini pour la valeur UID utilisable la plus élevée, 60000 sur n'importe quel système que j'ai vérifié.
Ryaner
6
La page de manuel de login.defsindique que dans ce contexte, UID_MAXne contrôle que l'uid le plus élevé qui sera automatiquement attribué aux nouveaux utilisateurs créés avec useradd.
Stephen Touset
2
C'est probablement 2 ^ 32 (4 milliards au lieu de 2). Sur RHEL, l' UID 4 294 967 295 (2 ^ 32-1) est souvent réservé pour un UID "valeur non valide" et 4 294 967 294 (2 ^ 32-2) est réservé à l'utilisateur nfsnobody dans certains systèmes d'exploitation. Ainsi, la valeur maximale non réservée est de 4 294 967 293 (2 ^ 32-3)
tehnicaorg
4

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

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 découvrir le type C. Étant donné que vous avez besoin de la taille en octets, votre meilleure option consiste à analyser le nom de typedef conformément aux spécifications de 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 un one-liner:

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

Ici, cela Usignifie unsigned(cela peut aussi être Spour signed) et 32est la taille (recherchez-la dans la liste ci-dessus; je pense, 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 il serait peut-être préférable d' caseactiver cette valeur).

Kirelagin
la source
1
Sur mon système (Ubuntu 12.04) et d'autres systèmes basés sur Debian, le fichier d'en-tête est: /usr/include/$(gcc -print-multiarch)/bits/typesizes.hou alternativement:/usr/include/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/bits/typesizes.h
pabouk
1
Avoir ces fichiers glibc signifierait probablement qu'un compilateur est disponible. On pourrait donc #inclure <sys / types.h> pour avoir accès à uid_t et imprimer le résultat ( printf ("uid_t:% d octets (% d bits) \ n", sizeof (uid_t), sizeof (uid_t) * 8 ); )
tehnicaorg
3

Voilà une question intéressante. Je serais surpris s'il existait une méthode standard et portable pour le déterminer.

Je n'ai pas de boîte Linux à portée de main, mais la idcommande 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 idse termineraient à zéro avec 65'536(si l'UID 16 bits) et / 4'294'967'296ou une erreur si vous alliez au-delà de la limite du système.

Geoff Fritz
la source
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 2147483647.

# groupadd -g 42949672950 testgrp
# more /etc/group
testgrp:*:2147483647:
Donald Byrd
la source