Unix UID ne kadar büyük (bit olarak)?


18

Unix kullanıcı kimliklerinin (UID) genellikle 16 veya 32 bit imzasız tamsayı olduğunu anlıyorum, ancak herhangi bir sistem için (kabukta) nasıl bulabilirim?

Yanıtlar:


12

Sen bakmak gerekir <limits.h>(ör içerdiği dosyaların veya bir sys/syslimits.hiçin OS X) #defineait UID_MAX.

En son işletim sistemleri (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) en fazla iki milyar ( 2^31-2) işleyebilir , bu yüzden bunu kabul edip 't.


1
Maalesef diye bir şey yok UID_MAX. Örneğin, UID için maksimum değeri bulmak için shadow-utilskullanılan araçlar (uid_t)-1.
kirelagin

5
Çoğu sistem, kontrol ettiğim herhangi bir sistemde kullanılabilir en yüksek UID değeri olan 60000 için UID_MAX ayarlanmış olan /etc/login.defs kullanır.
Ryaner

6
Manpage için login.defsbu bağlamda, gösterir UID_MAXsadece otomatik oluşturulan yeni kullanıcılar için atanacaktır en yüksek uid kontrol eder useradd.
Stephen Touset

2
Muhtemelen 2 ^ 32 (2 yerine 4 milyar). RHEL UID'de 4.294.967.295 (2 ^ 32-1) genellikle "geçersiz değer" UID'si için ayrılır ve 4.294.967.294 (2 ^ 32-2) bazı işletim sistemlerinde nfsnobody kullanıcısı için ayrılır. Böylece, rezerve edilmeyen maksimum değer 4.294.967.293 (2 ^ 32-3)
tehnicaorg

4

glibc, tüm bu sistem türleri için tanımlar sağlar.

Kontrol edebilirsiniz /usr/include/bits/typesizes.h:

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

Sonra içine bak /usr/include/bits/types.h:

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

Bu, C tipini bulmanızı sağlar. Bayt cinsinden boyuta ihtiyacınız olduğundan, en iyi seçeneğiniz, typedef adını aşağıdaki spesifikasyona göre ayrıştırmaktır 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

Yani, burada bir astar var:

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

İşte Uaraçlar unsigned(bu da olabilir Siçin signed) ve 32boyutu (yukarıda listede bakmak, ben çoğu zaman bunu zaten bayt cinsinden boyutu olduğunu varsayabiliriz, düşünmek, ancak isterseniz sizin komut tamamen taşınabilir olmasını casebu değeri açmak daha iyi olabilir ).


1
Sistemimde (Ubuntu 12.04) ve diğer Debian tabanlı sistemlerde başlık dosyası: /usr/include/$(gcc -print-multiarch)/bits/typesizes.hveya alternatif olarak:/usr/include/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/bits/typesizes.h
pabouk

1
Bu glibc dosyalarına sahip olmak, muhtemelen bir derleyici olduğu anlamına gelir. Böylece uid_t erişimine sahip olmak ve sonucu yazdırmak için #sys / types.h> ifadesi dahil edilebilir ( printf ("uid_t:% d bayt (% d bit) \ n", sizeof (uid_t), sizeof (uid_t) * 8 ); )
tehnicaorg

3

Bu ilginç bir soru. Bunu belirlemek için standart, taşınabilir bir yöntem olsaydı şaşırırdım.

Kullanışlı bir Linux kutusu yok, ancak idFreeBSD 8.0'daki komut sıfıra geri sarar:

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

Bu tanımsız davranış olduğundan eminim, ama çoğu sürümü idya 65'536(16-bit UID ise) sıfıra sarın ve 4'294'967'296veya sistem sınırının ötesine geçti eğer hata dışarı bahis .


3

Gelen bu bağlantı soru sorulur ve cevap 2,147,483,647 bir maks değeri saklamak için 31 bit bırakarak, soru kullanımlarında imzalı uzun int sistemini belirlemek için bir deneme ve hata yöntemini kullanır.

# groupadd -g 42949672950 testgrp
# more /etc/group
testgrp:*:2147483647:
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.