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.h
unter OS X) nach dem #define
von 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 U
bedeutet unsigned
(dies kann auch S
für stehen signed
) und 32
ist 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, case
diesen 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 id
Befehl 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 id
entweder auf Null umbrechen 65'536
(bei 16-Bit-UID) oder 4'294'967'296
einen Fehler ausgeben, wenn Sie das Systemlimit überschreiten.