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

18

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

Josef
fonte

Respostas:

12

Você precisará procurar <limits.h>(ou um dos arquivos que inclui, por exemplo, sys/syslimits.hno OS X) o arquivo #definede 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), portanto, eu suponho isso e faço uma solução alternativa para os sistemas mais obscuros que não 't.

DM.
fonte
1
Infelizmente, não existe UID_MAX. Por exemplo, ferramentas shadow-utilsutilizadas (uid_t)-1para descobrir o valor máximo para o UID.
kirelagin
5
A maioria dos sistemas usa /etc/login.defs, que possui UID_MAX definido para o maior valor de UID utilizável, 60000 em qualquer sistema que verifiquei.
Ryaner 5/08/14
6
A página de manual para login.defsindica que, nesse contexto, UID_MAXsó controla a maior uid que será atribuída automaticamente para novos usuários criados com useradd.
Stephen Touset
2
Provavelmente é 2 ^ 32 (4 bilhões em vez de 2). No RHEL, o UID 4.294.967.295 (2 ^ 32-1) geralmente é reservado para um UID de "valor inválido" e 4.294.967.294 (2 ^ 32-2) é reservado para o usuário nfsnobody em alguns sistemas operacionais. Assim, o valor máximo não reservada é 4294967293 (2 ^ 32-3)
tehnicaorg
4

O 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 do 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 frase:

% 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 (consulte-o na lista acima; acho que, na maioria das vezes, você pode assumir que já é tamanho em bytes, mas se você deseja que seu script seja totalmente portátil) pode ser melhor caseativar esse valor).

Kirelagin
fonte
1
No meu sistema (Ubuntu 12.04) e outros sistemas baseados em Debian o arquivo de cabeçalho é: /usr/include/$(gcc -print-multiarch)/bits/typesizes.hou alternativamente:/usr/include/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/bits/typesizes.h
pabouk
1
Ter esses arquivos glibc provavelmente significaria que existe um compilador disponível. Então, pode-se # incluir <sys / types.h> para acessar uid_t e imprimir o resultado ( printf ("uid_t:% d bytes (% d bits) \ n", sizeof (uid_t), sizeof (uid_t) * 8 ); )
tehnicaorg 22/09
3

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

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

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

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

Geoff Fritz
fonte
3

Nesse link, a pergunta é feita e o respondedor usa um método de tentativa e erro para determinar se o sistema em questão usa um int 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:
Donald Byrd
fonte