Насколько большой (в битах) является Unix UID?

Там, сделанный это. Перемещенный от Сетевого обеспечения до Win2K приблизительно 8 лет назад, и да, различия в том, как работа полномочий может быть камнем преткновения. Лучший совет, который я могу дать, не состоит в том, чтобы слишком зависнуться об этом, и иногда принимать меньше идеальное решение.

Вы никогда не будете мочь копировать точное поведение, поэтому к чему оно сводится, то, что требуется, чтобы позволять Вашим пользователям достигнуть данные, в которых они нуждаются. Я не могу сказать Вам, как получить его работающий точно тот же путь, как это сделало при Сетевом обеспечении, но я могу дать некоторые подсказки относительно того, как постараться не создавать что-то, что могло бы возвратиться, чтобы укусить Вас.

В этом случае я стремился бы сохранять структуру максимально простой. При разделении "auditreports" папки, поскольку отдельная папка группы была бы моим первым шагом. Технически нет никакой настоящей причины, чтобы сделать это, это хорошо работало бы как подпапка с корректным управлением правами на, но с точки зрения хранения Вашей стороны дома, управляемого, это делает вещи легче.

Следующая вещь, которую я делаю, каждый раз, помещается UNC в папку группы в описание группы в AD. Таким образом, можно записать сценарий входа в систему, который читает группы, которых пользователь является членом, вытаскивает свойство описания и подключает диск к нему. Я не уверен, есть ли у Вас AD из Вашего сообщения, но наличие сценария входа в систему, который Вы никогда не должны обновлять, экономит на БОЛЬШОМ КОЛИЧЕСТВЕ администратора наверху. Если можно сделать это в среде, сделайте это.

Наконец, и возвращение к моей первой точке, прибытие в совместный доступ к файлам Windows с Вашей шляпой Сетевого обеспечения твердо на не являются хорошей идеей. Они - differnent OSs, и они просто работают по-другому. В идеальном мире Вы просто мигрировали бы, и абсолютно ничто не изменится, насколько пользователи заинтересованы, но иногда просто необходимо повредить те яйца для создания того омлета.

18
задан 22 January 2010 в 04:28
4 ответа

Необходимо будет заглянуть <limits.h> (или один из файлов это включает, например, sys/syslimits.h на OS X) для #define из UID_MAX.

Новые операционные системы (Солярис 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) могут обработать до двух миллиардов (2^31-2), таким образом, я предположил бы, что и делают обходное решение для более неясных систем, которые не делают.

12
ответ дан 2 December 2019 в 20:25

В этой ссылке задают вопрос, и респондент использует пробную версию и ошибочный метод, чтобы решить, что рассматриваемая система использует длинное целое со знаком, оставляя 31 бит для хранения значения, с макс. из 2,147,483,647.

# groupadd -g 42949672950 testgrp
# more /etc/group
testgrp:*:2147483647:
3
ответ дан 2 December 2019 в 20:25

Это - интересный вопрос. Я был бы удивлен, был ли стандартный, портативный метод для определения этого.

У меня нет поля 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
ответ дан 2 December 2019 в 20:25

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 означает беззнаковый (это также может быть S для подписанный ), а 32 - это размер (его можно найти в список выше; я думаю, в большинстве случаев вы можете предположить, что это уже размер в байтах, но если вы хотите, чтобы ваш скрипт был полностью переносимым, может быть лучше сделать case включить это значение).

Вы можете проверить /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 означает беззнаковый (это также может быть S для подписанный ), а 32 - это размер (его можно найти в список выше; я думаю, в большинстве случаев вы можете предположить, что это уже размер в байтах, но если вы хотите, чтобы ваш скрипт был полностью переносимым, может быть лучше сделать case включить это значение).

Вы можете проверить /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 означает беззнаковый (это также может быть S для подписанный ), а 32 - это размер (см. Его в список выше; я думаю, в большинстве случаев вы можете предположить, что это уже размер в байтах, но если вы хотите, чтобы ваш скрипт был полностью переносимым, может быть лучше сделать case включить это значение). 1151698]

% 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 означает беззнаковый (это также может быть S для подписанный ), а 32 - это размер (см. Его в список выше; я думаю, в большинстве случаев вы можете предположить, что это уже размер в байтах, но если вы хотите, чтобы ваш скрипт был полностью переносимым, может быть лучше сделать case включить это значение). 1151698]

% 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 означает беззнаковый (это также может быть S для подписанный ), а 32 - это размер (см. Его в список выше; я думаю, в большинстве случаев вы можете предположить, что это уже размер в байтах, но если вы хотите, чтобы ваш скрипт был полностью переносимым, может быть лучше сделать case включить это значение). 1151698]

4
ответ дан 2 December 2019 в 20:25

Теги

Похожие вопросы