题 Unix UID有多大(以位为单位)?


我知道unix用户ID(UID)通常是16位或32位无符号整数,但是如何找到任何给定系统(在shell中)?


15
2018-01-22 02:28






答案:


你需要看看 <limits.h> (或其中包含的文件之一,例如, sys/syslimits.h 在OS X上) #define 的 UID_MAX

最新的操作系统(Solaris 2.x,OS X,BSD,Linux,HP-UX 11i,AIX 6)可以处理多达20亿(2^31-2),所以我会假设并为没有的更加模糊的系统做出解决方法。


9
2018-01-22 03:04



不幸的是,没有这样的事情 UID_MAX。例如,来自的工具 shadow-utils 使用 (uid_t)-1 找出UID的最大值。 - kirelagin
大多数系统使用/etc/login.defs,其中UID_MAX设置为最高可用UID值,在我检查过的任何系统上都是60000。 - Ryaner
该 手册页 对于 login.defs 表示在这种情况下, UID_MAX 仅控制将为创建的新用户自动分配的最高uid useradd。 - Stephen Touset
它可能是2 ^ 32(40亿而不是2)。在RHEL上 UID 4,294,967,295(2 ^ 32-1)通常保留用于“无效值”UID,并且在某些操作系统中为nfsnobody用户保留4,294,967,294(2 ^ 32-2)。因此,最大非保留值为4,294,967,293(2 ^ 32-3) - tehnicaorg


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 打开这个值)。


4
2018-03-30 09:10



在我的系统(Ubuntu 12.04)和其他基于Debian的系统上,头文件是: /usr/include/$(gcc -print-multiarch)/bits/typesizes.h 或者: /usr/include/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/bits/typesizes.h - pabouk
拥有那些glibc文件可能意味着有一个编译器可用。所以有人可以 #include <sys / types.h> 有权访问 将uid_t 并打印结果( printf(“uid_t:%d字节(%d位)\ n”,sizeof(uid_t),sizeof(uid_t)* 8); ) - tehnicaorg


这是一个有趣的问题。如果有一种标准的便携式方法来确定这一点,我会感到惊讶。

我没有方便的Linux盒子,但是 id FreeBSD 8.0上的命令回归到零:

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

我确定这是未定义的行为,但我打赌大多数版本的 id 将要用0包裹到零 65'536 (如果是16位UID)和 4'294'967'296 如果超出系统限制,则输出错误。


3
2018-01-22 03:04





这个链接 询问问题并且响应者使用试错法确定有问题的系统使用带符号的long int,留下31位来存储该值,最大值为2,147,483,647。

# groupadd -g 42949672950 testgrp
# more /etc/group
testgrp:*:2147483647:

3
2018-01-22 02:54