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)?
18
Você precisará procurar <limits.h>
(ou um dos arquivos que inclui, por exemplo, sys/syslimits.h
no OS X) o arquivo #define
de 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.
UID_MAX
. Por exemplo, ferramentasshadow-utils
utilizadas(uid_t)-1
para descobrir o valor máximo para o UID.login.defs
indica que, nesse contexto,UID_MAX
só controla a maior uid que será atribuída automaticamente para novos usuários criados comuseradd
.O glibc fornece definições para todos esses tipos de sistema.
Você pode checar
/usr/include/bits/typesizes.h
:Em seguida, você analisa
/usr/include/bits/types.h
: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
:Então, aqui está uma frase:
Aqui
U
significaunsigned
(isso também pode serS
parasigned
) e32
é 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 melhorcase
ativar esse valor).fonte
/usr/include/$(gcc -print-multiarch)/bits/typesizes.h
ou alternativamente:/usr/include/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/bits/typesizes.h
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
id
comando no FreeBSD 8.0 volta ao zero:Tenho certeza de que esse é um comportamento indefinido, mas eu apostaria que a maioria das versões
id
seria zerada com65'536
(se UID de 16 bits) e4'294'967'296
sairia com erro se você ultrapassasse o limite do sistema.fonte
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.
fonte