Làm thế nào lớn (tính bằng bit) là một UID Unix?


18

Tôi hiểu rằng ID người dùng unix (UID) thường là các số nguyên không dấu 16 hoặc 32 bit nhưng làm cách nào tôi có thể tìm ra bất kỳ hệ thống cụ thể nào (trong một vỏ)?

Câu trả lời:


12

Bạn sẽ cần phải nhìn vào <limits.h>(hoặc một trong các tập tin nó bao gồm, ví dụ, sys/syslimits.htrên OS X) cho #definecác UID_MAX.

Hầu hết các hệ điều hành gần đây (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) có thể xử lý tới hai tỷ ( 2^31-2), vì vậy tôi sẽ giả định điều đó và giải quyết cho các hệ thống khó hiểu hơn 't.


1
Thật không may, không có những thứ như UID_MAX. Ví dụ: các công cụ từ shadow-utilsviệc sử dụng (uid_t)-1để tìm ra giá trị tối đa cho UID.
kirelagin

5
Hầu hết các hệ thống sử dụng /etc/login.defs có UID_MAX được đặt cho giá trị UID có thể sử dụng cao nhất, 60000 trên bất kỳ hệ thống nào tôi đã kiểm tra.
Ryaner

6
Các manpage cho login.defsthấy rằng trong bối cảnh đó, UID_MAXchỉ kiểm soát uid cao nhất mà sẽ tự động được gán cho người dùng mới tạo ra với useradd.
Stephen Touset

2
Có lẽ là 2 ^ 32 (4 tỷ thay vì 2). Trên RHEL UID 4.294.967.295 (2 ^ 32-1) thường được dành riêng cho UID "giá trị không hợp lệ" và 4.294.967.294 (2 ^ 32-2) được dành riêng cho người dùng nfsnobody trong một số hệ điều hành. Do đó, giá trị không dành riêng tối đa là 4.294.967.293 (2 ^ 32-3)
tehnicaorg

4

glibc cung cấp định nghĩa cho tất cả các loại hệ thống.

Bạn có thể kiểm tra /usr/include/bits/typesizes.h:

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

Tiếp theo bạn nhìn vào /usr/include/bits/types.h:

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

Điều này cho phép bạn tìm ra loại C. Vì bạn cần kích thước theo byte, tùy chọn tốt nhất của bạn là phân tích tên typedef theo đặc tả trong 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

Vì vậy, đây là một lót:

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

Ở đây Ucó nghĩa là unsigned(cái này cũng có thể Sdùng signed) và 32là kích thước (tìm nó trong danh sách ở trên; tôi nghĩ, hầu hết thời gian bạn có thể cho rằng đó đã có kích thước theo byte, nhưng nếu bạn muốn tập lệnh của mình có thể di chuyển hoàn toàn có thể tốt hơn để làm casechuyển đổi trên giá trị này).


1
Trên hệ thống của tôi (Ubuntu 12.04) và các hệ thống dựa trên Debian khác, tệp tiêu đề là: /usr/include/$(gcc -print-multiarch)/bits/typesizes.hhoặc cách khác:/usr/include/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/bits/typesizes.h
pabouk

1
Có những tệp glibc đó có thể có nghĩa là có một trình biên dịch có sẵn. Vì vậy, người ta có thể #include <sys / type.h> để có quyền truy cập vào uid_t và in kết quả ( printf ("uid_t:% d byte (% d bit) \ n", sizeof (uid_t), sizeof (uid_t) * 8 ); )
tehnicaorg

3

Đó là một câu hỏi thú vị. Tôi sẽ ngạc nhiên nếu có một phương pháp di động tiêu chuẩn để xác định điều này.

Tôi không có hộp Linux tiện dụng, nhưng idlệnh trên FreeBSD 8.0 kết thúc bằng 0:

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

Tôi chắc chắn đây là hành vi không xác định, nhưng tôi muốn rằng hầu hết các phiên bản idsẽ kết thúc bằng 0 65'536(nếu UID 16 bit) và 4'294'967'296lỗi nếu bạn vượt quá giới hạn hệ thống.


3

Trong liên kết này , câu hỏi được hỏi và người trả lời sử dụng phương pháp dùng thử & lỗi để xác định hệ thống được đề cập sử dụng một int dài đã ký, để lại 31 bit để lưu trữ giá trị, với tối đa là 2.147.483.647.

# groupadd -g 42949672950 testgrp
# more /etc/group
testgrp:*:2147483647:
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.