Quão grande (em bits) é um UID Unix?

17

Eu entendo que UIDs (Unix User IDs) são geralmente inteiros não assinados de 16 ou 32 bits, mas como posso descobrir para qualquer sistema (em um shell)?

    
por Josef 22.01.2010 / 03:28

4 respostas

11

Você precisará procurar em <limits.h> (ou um dos arquivos incluídos, por exemplo, sys/syslimits.h no OS X) para o #define de UID_MAX .

Os sistemas operacionais mais recentes (Solaris 2.x, Mac OS X, BSD, Linux, HP-UX 11i e AIX 6) podem manipular até dois bilhões ( 2^31-2 ), portanto, presumo que isso seja uma solução alternativa para os sistemas mais obscuros que não o fazem.

    
por 22.01.2010 / 04:04
4

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

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

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

Em seguida, você analisa o /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á um verso:

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

Aqui U significa unsigned (isso também pode ser S para signed ) e 32 é o tamanho (pesquise na lista acima; acho que na maioria das vezes você pode supor que já é tamanho em bytes, mas se você quiser que seu script seja totalmente portátil, pode ser melhor fazer case mudar este valor).

    
por 30.03.2014 / 11:10
3

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

Eu não tenho uma caixa do Linux à mão, mas o comando id no FreeBSD 8.0 volta para zero:

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

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

    
por 22.01.2010 / 04:04
3

Em este link , a questão é solicitado e um respondedor usa um teste & erro método para determinar o sistema em questão usa um longo int 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:
    
por 22.01.2010 / 03:54

Tags