Antworten:
Sie müssen in <limits.h>
(oder einer der darin enthaltenen Dateien, z. B. sys/syslimits.h
unter OS X) nach dem #define
von 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.
login.defs
gibt an, dass in diesem Kontext UID_MAX
nur die höchste UID gesteuert wird, die automatisch für neue Benutzer zugewiesen wird, die mit erstellt wurden useradd
.
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 U
bedeutet unsigned
(dies kann auch S
für sein signed
) und 32
ist 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, case
diesen Wert einzuschalten).
/usr/include/$(gcc -print-multiarch)/bits/typesizes.h
oder alternativ:/usr/include/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/bits/typesizes.h
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 id
Befehl 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 id
entweder mit 65'536
(wenn 16-Bit-UID) auf Null umbrechen würden 4'294'967'296
oder Fehler auftreten, wenn Sie das Systemlimit überschreiten.
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:
UID_MAX
.shadow-utils
Verwenden Sie beispielsweise Tools(uid_t)-1
, um den Maximalwert für die UID zu ermitteln.