GNU/Linux >> LINUX-Kenntnisse >  >> Linux

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

Lösung 1:

Sie müssen in 00 suchen (oder eine der darin enthaltenen Dateien, z. B. 17 unter OS X) für 27 von 34 .

Die neuesten Betriebssysteme (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) können bis zu zwei Milliarden (42 ), also würde ich davon ausgehen und eine Problemumgehung für die obskureren Systeme vornehmen, die dies nicht tun.

Lösung 2:

glibc stellt Definitionen für all diese Systemtypen bereit.

Sie können 57 überprüfen :

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

Als nächstes sehen Sie sich 61 an :

% 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, parsen Sie am besten den Typedef-Namen gemäß der Spezifikation in 74 :

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 86 bedeutet 93 (dies kann auch 106 sein für 113 ) und 124 ist die Größe (sehen Sie sie in der obigen Liste nach; ich denke, meistens können Sie davon ausgehen, dass dies bereits die Größe in Bytes ist, aber wenn Sie möchten, dass Ihr Skript vollständig portabel ist, ist es möglicherweise besser, 139 diesen Wert einschalten).

Lösung 3:

In diesem Link wird die Frage gestellt, und ein Antwortender verwendet eine Trial-and-Error-Methode, um festzustellen, dass das betreffende System eine vorzeichenbehaftete lange Ganzzahl verwendet, wobei 31 Bits verbleiben, um den Wert zu speichern, mit einem Maximum von 2.147.483.647.

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

Lösung 4:

Das ist eine interessante Frage. Ich wäre überrascht, wenn es eine tragbare Standardmethode gäbe, um dies zu bestimmen.

Ich habe keine Linux-Box zur Hand, aber die 147 Befehl unter FreeBSD 8.0 springt auf Null zurück:

# 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 würde wetten, dass die meisten Versionen von 156 würde entweder mit 165 auf Null umbrechen (bei 16-Bit-UID) und 179 oder Fehler aus, wenn Sie die Systemgrenze überschritten haben.


Linux
  1. Wie groß ist der Pipe-Puffer?

  2. Wie benachrichtigt man über den Abschluss einer langen Aufgabe über SSH?

  3. So ändern Sie UID oder GID sicher in Linux

  4. So listen Sie offene Ports auf einem Linux/Unix-Server auf

  5. Wie man Zeilen in einer Datei in UNIX/Linux zählt

So verwenden Sie den grep-Befehl unter Linux/UNIX

So installieren Sie Rclone unter Linux und Unix

So konfigurieren Sie eine statische IP-Adresse in Linux und Unix

So konvertieren Sie eine Windows-Datei in eine UNIX-Datei

Wie passwortloses SSH unter Linux / UNIX funktioniert

Wie entferne ich setgid (Linux/Unix)?