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

18

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

Josef
quelle

Antworten:

12

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 neuesten 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, dass dies ein Workaround für die weniger bekannten Systeme ist nicht.

DM.
quelle
1
Leider gibt es so etwas nicht UID_MAX. shadow-utilsVerwenden Sie beispielsweise Tools (uid_t)-1, um den Maximalwert für die UID zu ermitteln.
kirelagin
5
Die meisten Systeme verwenden /etc/login.defs, bei dem UID_MAX für den höchsten verwendbaren UID-Wert (60000) auf allen von mir überprüften Systemen festgelegt ist.
Ryaner
6
Die Manpage für login.defsgibt an, dass in diesem Kontext UID_MAXnur die höchste UID gesteuert wird, die automatisch für neue Benutzer zugewiesen wird, die mit erstellt wurden useradd.
Stephen Touset
2
Es ist wahrscheinlich 2 ^ 32 (4 Milliarden statt 2). In RHEL ist die UID 4.294.967.295 (2 ^ 32-1) häufig für eine UID mit "ungültigem Wert" reserviert, und 4.294.967.294 (2 ^ 32-2) ist in einigen Betriebssystemen für den Benutzer nfsnobody reserviert. Somit ist der maximale nicht reservierte Wert 4.294.967.293 (2 ^ 32-3)
tehnicaorg
4

glibc bietet Definitionen für alle diese Systemtypen.

Sie können überprüfen /usr/include/bits/typesizes.h:

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

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

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

Auf diese Weise können Sie den C-Typ ermitteln. Da Sie die Größe in Bytes benötigen, analysieren Sie am besten den typedef-Namen gemäß der Angabe in 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 sein signed) und 32ist die Größe (schauen Sie in der obigen Liste nach; ich denke, die meiste Zeit können Sie davon ausgehen, dass dies bereits eine Größe in Bytes ist, aber wenn Sie möchten, dass Ihr Skript vollständig portierbar ist ist möglicherweise besser, casediesen Wert einzuschalten).

kirelagin
quelle
1
Auf meinem System (Ubuntu 12.04) und anderen Debian-basierten Systemen lautet die Header-Datei: /usr/include/$(gcc -print-multiarch)/bits/typesizes.hoder alternativ:/usr/include/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/bits/typesizes.h
pabouk
1
Wenn Sie diese glibc-Dateien haben, ist wahrscheinlich ein Compiler verfügbar. Man könnte also #einschließen , dass <sys / types.h> Zugriff auf uid_t hat, und das Ergebnis ausdrucken ( printf ("uid_t:% d Bytes (% d Bits) \ n", sizeof (uid_t), sizeof (uid_t) * 8 ); )
tehnicaorg
3

Das ist eine interessante Frage. Es würde mich wundern, wenn es eine übliche, tragbare Methode geben würde, um dies festzustellen.

Ich habe keine Linux-Box zur Hand, aber der idBefehl unter FreeBSD 8.0 wird auf Null zurückgesetzt:

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

Ich bin mir sicher, dass dies ein undefiniertes Verhalten ist, aber ich wette, dass die meisten Versionen von identweder mit 65'536(wenn 16-Bit-UID) auf Null umbrechen würden 4'294'967'296oder Fehler auftreten, wenn Sie das Systemlimit überschreiten.

Geoff Fritz
quelle
3

In diesem Link wird die Frage gestellt, und ein Antwortender verwendet eine Trial & Error-Methode, um zu bestimmen, dass das betreffende System ein vorzeichenbehaftetes langes int verwendet, wobei 31 Bit zum Speichern des Werts mit einem Maximum von 2.147.483.647 verbleiben.

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