GNU/Linux >> Linux Esercitazione >  >> Linux

Quanto è grande (in bit) un UID Unix?

Soluzione 1:

Dovrai cercare in <limits.h> (o uno dei file che include, ad esempio sys/syslimits.h su OS X) per #define di UID_MAX .

I sistemi operativi più recenti (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) possono gestire fino a due miliardi (2^31-2 ), quindi lo presumo e creo una soluzione alternativa per i sistemi più oscuri che non lo fanno.

Soluzione 2:

glibc fornisce definizioni per tutti questi tipi di sistema.

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

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

Poi guardi in /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. Dal momento che hai bisogno della dimensione in byte, la tua migliore opzione è analizzare il nome typedef secondo la specifica 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 una riga:

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

Qui U significa unsigned (può anche essere S per signed ) e 32 è la dimensione (cercala nell'elenco sopra; penso che la maggior parte delle volte puoi presumere che sia già la dimensione in byte, ma se vuoi che il tuo script sia completamente portabile potrebbe essere meglio fare case attiva questo valore).

Soluzione 3:

In questo collegamento viene posta la domanda e un risponditore utilizza un metodo di prova ed errore per determinare che il sistema in questione utilizza un long int 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:

Soluzione 4:

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

Non ho una macchina Linux a portata di mano, ma il id comando su FreeBSD 8.0 ritorna a zero:

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

Sono sicuro che questo è un comportamento indefinito, ma scommetto che la maggior parte delle versioni di id andrebbe a capo a zero con 65'536 (se UID a 16 bit) e 4'294'967'296 o errore se sei andato oltre il limite di sistema.


Linux
  1. Linux – Come visualizzare il messaggio di benvenuto in Unix??

  2. Tutorial Unix Sed:come eseguire più comandi Sed

  3. Come modificare UID o GID in modo sicuro in Linux

  4. Come elencare le porte aperte sul server Linux/Unix

  5. UNIX / Linux:come eliminare l'utente root equivalente (utente non root con UID 0)

Come usare il comando grep in Linux/UNIX

Come installare Rclone in Linux e Unix

Come configurare l'indirizzo IP statico in Linux e Unix

Come convertire un file Windows in un file UNIX

Come rimuovere setgid (linux/unix)?

Come ottenere il nome dell'utente da uid