Quanto è grande (in bit) un UID Unix?


18

Capisco che gli ID utente unix (UID) sono in genere numeri interi senza segno a 16 o 32 bit, ma come posso scoprire per un determinato sistema (in una shell)?

Risposte:


12

Dovrai cercare <limits.h>(o uno dei file che include, ad esempio, sys/syslimits.hsu OS X) per il #definedi UID_MAX.

I sistemi operativi più recenti (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) sono in grado di gestire fino a due miliardi ( 2^31-2), quindi lo presumo e farei una soluzione alternativa per i sistemi più oscuri che don 't.


1
Purtroppo, non esiste una cosa come UID_MAX. Ad esempio, strumenti da shadow-utilsutilizzare (uid_t)-1per scoprire il valore massimo per l'UID.
kirelagin

5
La maggior parte dei sistemi usa /etc/login.defs che ha UID_MAX impostato per il massimo valore UID utilizzabile, 60000 su qualsiasi sistema che ho controllato.
Ryaner

6
La manpage per login.defsindica che in quel contesto UID_MAXcontrolla solo il massimo uid che verrà automaticamente assegnato ai nuovi utenti creati con useradd.
Stephen Touset,

2
Probabilmente sono 2 ^ 32 (4 miliardi anziché 2). Su RHEL UID 4.294.967.295 (2 ^ 32-1) è spesso riservato per un UID "valore non valido" e 4.294.967.294 (2 ^ 32-2) è riservato all'utente nfsnobody in alcuni sistemi operativi. Quindi il valore massimo non riservato è 4.294.967.293 (2 ^ 32-3)
tehnicaorg

4

glibc fornisce le definizioni per tutti quei tipi di sistema.

Puoi controllare /usr/include/bits/typesizes.h:

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

Successivamente si esamina /usr/include/bits/types.h:

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

Questo ti permette di scoprire il tipo C. Dato che hai bisogno della dimensione in byte, la tua migliore opzione è analizzare il nome del typedef in base alle specifiche 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

Quindi, ecco un one-liner:

% grep '#define __UID_T_TYPE' /usr/include/bits/typesizes.h | cut -f 3 | sed -r 's/__([US])([^_]*)_.*/\1 \2/'
U 32

Qui Usignifica unsigned(questo può essere anche Sper signed) ed 32è la dimensione (cercala nell'elenco sopra; Penso, la maggior parte delle volte puoi presumere che sia già dimensione in byte, ma se vuoi che il tuo script sia completamente portatile potrebbe essere meglio caseattivare questo valore).


1
Sul mio sistema (Ubuntu 12.04) e su altri sistemi basati su Debian il file di intestazione è: /usr/include/$(gcc -print-multiarch)/bits/typesizes.ho in alternativa:/usr/include/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/bits/typesizes.h
pabouk

1
Avere quei file glibc significherebbe probabilmente che c'è un compilatore disponibile. Quindi si potrebbe #includere <sys / types.h> per avere accesso a uid_t e stampare il risultato ( printf ("uid_t:% d byte (% d bit) \ n", sizeof (uid_t), sizeof (uid_t) * 8 ); )
tehnicaorg,

3

Questa è una domanda interessante. Sarei sorpreso se ci fosse un metodo portatile standard per determinarlo.

Non ho una Linux box a portata di mano, ma il idcomando su FreeBSD 8.0 torna a zero:

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

Sono sicuro che si tratta di un comportamento indefinito, ma scommetterei che la maggior parte delle versioni idandrebbero a zero con 65'536(se UID a 16 bit) 4'294'967'296o errore se andassi oltre il limite di sistema.


3

In questo collegamento viene posta la domanda e un responder utilizza un metodo di prova ed errore per determinare il sistema in questione utilizza un int long con segno, lasciando 31 bit per memorizzare il valore, con un massimo di 2.147.483.647.

# groupadd -g 42949672950 testgrp
# more /etc/group
testgrp:*:2147483647:
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.