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?
18
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.
UID_MAX
.shadow-utils
Verwenden Sie beispielsweise Tools(uid_t)-1
, um den Maximalwert für die UID zu ermitteln.login.defs
gibt an, dass in diesem KontextUID_MAX
nur die höchste UID gesteuert wird, die automatisch für neue Benutzer zugewiesen wird, die mit erstellt wurdenuseradd
.glibc bietet Definitionen für alle diese Systemtypen.
Sie können überprüfen
/usr/include/bits/typesizes.h
:Als nächstes schauen Sie in
/usr/include/bits/types.h
: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
:Also, hier ist ein Einzeiler:
Hier
U
bedeutetunsigned
(dies kann auchS
für seinsigned
) und32
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).quelle
/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:Ich bin mir sicher, dass dies ein undefiniertes Verhalten ist, aber ich wette, dass die meisten Versionen von
id
entweder mit65'536
(wenn 16-Bit-UID) auf Null umbrechen würden4'294'967'296
oder Fehler auftreten, wenn Sie das Systemlimit überschreiten.quelle
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.
quelle