Наскільки великим (у бітах) є Unix UID?


18

Я розумію, що ідентифікатори користувачів Unix (UID) зазвичай є 16 або 32 бітовими цілими числами без підпису, але як я можу дізнатися для будь-якої заданої системи (в оболонці)?

Відповіді:


12

Ви повинні дивитися в <limits.h>(або один з файлів , він включає в себе, наприклад, sys/syslimits.hна OS X) для #defineз UID_MAX.

Більшість останніх операційних систем (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) можуть обробляти до двох мільярдів ( 2^31-2), тому я б припустив, що і вирішити рішення для більш незрозумілих систем, на які працює 'т.


1
На жаль, такого не існує UID_MAX. Наприклад, інструменти, які shadow-utilsвикористовуються (uid_t)-1для з'ясування максимального значення для UID.
kirelagin

5
Більшість систем використовують /etc/login.defs, який має встановлений UID_MAX для найвищого значення UID, 60000 у будь-якій системі, яку я перевірив.
Ryaner

6
Сторінка керівництва для login.defsвказує , що в цьому контексті, UID_MAXконтролює тільки високий ідентифікатор користувача, який буде автоматично призначена для нових користувачів , створених з useradd.
Стівен Тузет

2
Це, ймовірно, 2 ^ 32 (4 мільярди замість 2). На RHEL UID 4,294,967,295 (2 ^ 32-1) часто зарезервовано для UID "недійсного значення", а 4,994,967,294 (2 ^ 32-2) зарезервовано для користувача nfsnobody в деяких операційних системах. Таким чином, максимальне
незарезервоване

4

glibc надає визначення для всіх цих типів системи.

Ви можете перевірити /usr/include/bits/typesizes.h:

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

Далі ви переглядаєте /usr/include/bits/types.h:

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

Це дозволяє дізнатися тип C. Оскільки вам потрібен розмір у байтах, ваш найкращий варіант - аналіз імені typedef відповідно до специфікації у 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

Отже, ось однолінійний:

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

Тут Uзасіб unsigned(це також може бути Sдля signed) і 32має розмір (подивитися його в списку вище, я думаю, більшу частину часу , можна припустити , що це вже розмір в байтах, але якщо ви хочете , щоб ваш сценарій , щоб бути повністю портативний його можливо, краще caseпереключити це значення).


1
У моїй системі (Ubuntu 12.04) та інших системах на базі Debian заголовочний файл: /usr/include/$(gcc -print-multiarch)/bits/typesizes.hабо альтернативно:/usr/include/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/bits/typesizes.h
pabouk

1
Наявність цих файлів glibc, ймовірно, означає, що є компілятор. Отже, можна #include <sys / types.h> мати доступ до uid_t та друкувати результат ( printf ("uid_t:% d байт (% d біт) \ n", sizeof (uid_t), sizeof (uid_t) * 8 ); )
tehnicaorg

3

Це цікаве питання. Я був би здивований, якби був стандартний, портативний метод для визначення цього.

У мене не зручна скринька Linux, але idкоманда на FreeBSD 8.0 повертається до нуля:

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

Я впевнений, що це невизначена поведінка, але я б став до того, що більшість версій idабо завершиться до нуля 65'536(якщо 16-бітний UID), 4'294'967'296або помиляться, якщо ви вийшли за межі системи.


3

У цьому посиланні задається питання, і відповідь використовує метод проб і помилок, щоб визначити, що система, яка використовується, використовує довгий підписаний int, залишаючи 31 біт для зберігання значення, максимум 2,147,483,647.

# groupadd -g 42949672950 testgrp
# more /etc/group
testgrp:*:2147483647:
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.