Qual o tamanho (em bits) de um UID Unix?

Qual o tamanho (em bits) de um UID Unix?

Eu entendo que os IDs de usuário unix (UIDs) são geralmente números inteiros não assinados de 16 ou 32 bits, mas como posso descobrir qualquer sistema (em um shell)?

Responder1

Você precisará procurar <limits.h>(ou um dos arquivos que ele inclui, por exemplo, sys/syslimits.hno OS X) pelo #definearquivo UID_MAX.

Os sistemas operacionais mais recentes (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) podem lidar com até dois bilhões ( 2^31-2), então eu assumiria isso e faria uma solução alternativa para os sistemas mais obscuros que não 't.

Responder2

glibc fornece definições para todos esses tipos de sistema.

Você pode checar /usr/include/bits/typesizes.h:

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

Em seguida, você analisa /usr/include/bits/types.h:

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

Isso permite que você descubra o tipo C. Como você precisa do tamanho em bytes, sua melhor opção é analisar o nome typedef de acordo com a especificação em 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

Então, aqui está uma linha:

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

Aqui Usignifica unsigned(isso também pode ser Spara signed) e 32é o tamanho (procure na lista acima; acho que na maioria das vezes você pode assumir que esse tamanho já é em bytes, mas se você quiser que seu script seja totalmente portátil, talvez seja melhor ativar caseesse valor).

Responder3

Emesse linka pergunta é feita e um respondente usa um método de tentativa e erro para determinar se o sistema em questão usa um inteiro longo assinado, deixando 31 bits para armazenar o valor, com um máximo de 2.147.483.647.

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

Responder4

Essa é uma pergunta interessante. Eu ficaria surpreso se houvesse um método padrão e portátil para determinar isso.

Não tenho uma caixa Linux à mão, mas o idcomando no FreeBSD 8.0 volta a zero:

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

Tenho certeza de que esse é um comportamento indefinido, mas aposto que a maioria das versões idseria zero com 65'536(se UID de 16 bits) e 4'294'967'296/ou erro se você ultrapassasse o limite do sistema.

informação relacionada