Wie groß (in Bits) ist eine Unix-UID?

Wie groß (in Bits) ist eine Unix-UID?

Ich verstehe, dass Unix-Benutzer-IDs (UIDs) normalerweise vorzeichenlose 16- oder 32-Bit-Ganzzahlen sind, aber wie kann ich das für ein beliebiges System (in einer Shell) herausfinden?

Antwort1

Sie müssen in <limits.h>(oder einer der darin enthaltenen Dateien, z. B. sys/syslimits.hunter OS X) nach dem #definevon suchen UID_MAX.

Die meisten aktuellen Betriebssysteme (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) können bis zu zwei Milliarden ( 2^31-2) verarbeiten, daher würde ich davon ausgehen und einen Workaround für die weniger bekannten Systeme schaffen, bei denen dies nicht der Fall ist.

Antwort2

glibc bietet Definitionen für alle diese Systemtypen.

Du kannst nachschauen /usr/include/bits/typesizes.h:

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

Als nächstes schauen Sie sich an /usr/include/bits/types.h:

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

Damit können Sie den C-Typ herausfinden. Da Sie die Größe in Bytes benötigen, ist es am besten, den Typdefinitionsnamen gemäß der Spezifikation in zu analysieren 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

Also, hier ist ein Einzeiler:

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

Hier Ubedeutet unsigned(dies kann auch Sfür stehen signed) und 32ist die Größe (schlagen Sie in der Liste oben nach; ich denke, meistens können Sie davon ausgehen, dass dies bereits die Größe in Bytes ist, aber wenn Ihr Skript vollständig portierbar sein soll, ist es möglicherweise besser, casediesen Wert einzuschalten).

Antwort3

Indieser Linkdie Frage wird gestellt und ein Antwortender verwendet eine Trial-and-Error-Methode, um zu ermitteln, ob das betreffende System einen vorzeichenbehafteten Long Int verwendet, sodass 31 Bits zum Speichern des Werts verbleiben, mit einem Maximum von 2.147.483.647.

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

Antwort4

Das ist eine interessante Frage. Es würde mich überraschen, wenn es eine standardisierte, portable Methode gäbe, um dies festzustellen.

Ich habe keine Linux-Box zur Hand, aber der idBefehl unter FreeBSD 8.0 führt zu einem Neustart auf Null:

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

Ich bin sicher, dass es sich hierbei um ein undefiniertes Verhalten handelt, würde aber wetten, dass die meisten Versionen identweder auf Null umbrechen 65'536(bei 16-Bit-UID) oder 4'294'967'296einen Fehler ausgeben, wenn Sie das Systemlimit überschreiten.

verwandte Informationen