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)?
18
Vous devrez rechercher <limits.h>
(ou l'un des fichiers qu'il contient, par exemple, sys/syslimits.h
sur OS X) pour le #define
of 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.
UID_MAX
. Par exemple, des outilsshadow-utils
utilisés(uid_t)-1
pour trouver la valeur maximale de l'UID.login.defs
indique que dans ce contexte,UID_MAX
ne contrôle que l'uid le plus élevé qui sera automatiquement attribué aux nouveaux utilisateurs créés avecuseradd
.la glibc fournit des définitions pour tous ces types de systèmes.
Vous pouvez vérifier
/usr/include/bits/typesizes.h
:Ensuite, vous examinez
/usr/include/bits/types.h
: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
:Alors, voici un one-liner:
Ici, cela
U
signifieunsigned
(cela peut aussi êtreS
poursigned
) et32
est 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'case
activer cette valeur).la source
/usr/include/$(gcc -print-multiarch)/bits/typesizes.h
ou alternativement:/usr/include/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/bits/typesizes.h
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
id
commande sur FreeBSD 8.0 revient à zéro:Je suis sûr que c'est un comportement indéfini, mais je parierais que la plupart des versions de
id
se termineraient à zéro avec65'536
(si l'UID 16 bits) et /4'294'967'296
ou une erreur si vous alliez au-delà de la limite du système.la source
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.
la source