Seberapa besar (dalam bit) adalah UID Unix?


18

Saya mengerti bahwa ID pengguna unix (UID) biasanya bilangan bulat unsigned 16 atau 32 bit tetapi bagaimana saya bisa mencari tahu untuk sistem yang diberikan (dalam shell)?

Jawaban:


12

Anda harus melihat ke dalam <limits.h>(atau salah satu file itu termasuk, misalnya, sys/syslimits.hpada OS X) untuk #definedari UID_MAX.

Sebagian besar sistem operasi terbaru (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) dapat menangani hingga dua miliar ( 2^31-2), jadi saya akan berasumsi dan membuat solusi untuk sistem yang lebih tidak jelas yang tidak 't.


1
Sayangnya, tidak ada yang namanya UID_MAX. Misalnya, alat dari shadow-utilspenggunaan (uid_t)-1untuk mengetahui nilai maksimal untuk UID.
kirelagin

5
Sebagian besar sistem menggunakan /etc/login.defs yang memiliki UID_MAX yang ditetapkan untuk nilai UID yang dapat digunakan tertinggi, 60000 pada sistem apa pun yang telah saya periksa.
Ryaner

6
The manualnya untuk login.defsmenunjukkan bahwa dalam konteks itu, UID_MAXhanya mengontrol uid tertinggi yang secara otomatis akan ditugaskan untuk pengguna baru dibuat dengan useradd.
Stephen Touset

2
Mungkin 2 ^ 32 (4 miliar bukannya 2). Pada RHEL UID 4.294.967.295 (2 ^ 32-1) sering dicadangkan untuk UID "nilai tidak valid", dan 4.294.967.294 (2 ^ 32-2) dicadangkan untuk pengguna nfsnobody di beberapa sistem operasi. Dengan demikian, nilai maksimum yang tidak dicadangkan adalah 4.294.967.293 (2 ^ 32-3)
tehnicaorg

4

glibc memberikan definisi untuk semua tipe sistem tersebut.

Anda dapat memeriksa /usr/include/bits/typesizes.h:

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

Selanjutnya Anda melihat /usr/include/bits/types.h:

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

Ini memungkinkan Anda menemukan tipe C. Karena Anda memerlukan ukuran dalam byte, opsi terbaik Anda adalah menguraikan nama typedef sesuai dengan spesifikasi di 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

Jadi, ini satu kalimat:

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

Di sini Uberarti unsigned(ini bisa juga Suntuk signed) dan 32merupakan ukuran (lihat di daftar di atas; saya pikir, sebagian besar waktu Anda dapat mengasumsikan bahwa itu sudah ukuran dalam byte, tetapi jika Anda ingin skrip Anda sepenuhnya portabel itu mungkin lebih baik untuk casemengaktifkan nilai ini).


1
Di sistem saya (Ubuntu 12.04) dan sistem berbasis Debian lainnya, file headernya adalah: /usr/include/$(gcc -print-multiarch)/bits/typesizes.hatau sebagai alternatif:/usr/include/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/bits/typesizes.h
pabouk

1
Memiliki file-file glibc mungkin berarti ada kompiler yang tersedia. Jadi orang dapat # mencantumkan <sys / types.h> untuk memiliki akses ke uid_t dan mencetak hasilnya ( printf ("uid_t:% d byte (% d bits) \ n", sizeof (uid_t), sizeof (uid_t) * 8 ); )
tehnicaorg

3

Itu pertanyaan yang menarik. Saya akan terkejut jika ada metode standar dan portabel untuk menentukan ini.

Saya tidak memiliki kotak Linux yang berguna, tetapi idperintah pada FreeBSD 8.0 kembali ke nol:

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

Saya yakin ini adalah perilaku yang tidak terdefinisi, tetapi saya berani bertaruh bahwa sebagian besar versi idakan membungkus ke nol dengan 65'536(jika 16-bit UID) dan 4'294'967'296atau kesalahan keluar jika Anda melampaui batas sistem.


3

Dalam tautan ini , pertanyaan diajukan dan responden menggunakan metode percobaan & kesalahan untuk menentukan sistem yang dimaksud menggunakan int panjang yang ditandatangani, meninggalkan 31 bit untuk menyimpan nilai, dengan maksimal 2,147.483.647.

# groupadd -g 42949672950 testgrp
# more /etc/group
testgrp:*:2147483647:
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.