कितना बड़ा (बिट्स) एक यूनिक्स यूआईडी है?


18

मैं समझता हूं कि यूनिक्स उपयोगकर्ता आईडी (यूआईडी) आमतौर पर 16 या 32 बिट अहस्ताक्षरित पूर्णांक हैं, लेकिन मैं किसी भी सिस्टम (शेल में) के लिए कैसे पता लगा सकता हूं?

जवाबों:


12

इसके लिए आपको <limits.h>(या इसमें शामिल फ़ाइलों में से एक, उदाहरण के लिए, sys/syslimits.hOS X पर) देखने #defineकी आवश्यकता होगी UID_MAX

सबसे हालिया ऑपरेटिंग सिस्टम (Solaris 2.x, OS X, BSD, Linux, HP-UX 11i, AIX 6) दो बिलियन ( 2^31-2) तक संभाल सकता है , इसलिए मैं यह मानूंगा कि अधिक अस्पष्ट प्रणालियों के लिए एक वर्कअराउंड बनाएं। 'टी।


1
दुर्भाग्य से, ऐसी कोई बात नहीं है UID_MAX। उदाहरण के लिए, यूआईडी के अधिकतम मूल्य का पता लगाने के लिए shadow-utilsउपयोग के उपकरण (uid_t)-1
कीर्लगिन

5
अधिकांश सिस्टम /etc/login.defs का उपयोग करते हैं, जिसमें UID_MAX सबसे अधिक उपयोग करने योग्य UID मान के लिए सेट है, किसी भी सिस्टम पर 60000 मैंने जाँच की है।
रेनर

6
मैनपेज के लिए login.defsइंगित करता है कि उस संदर्भ में, UID_MAXकेवल उच्चतम uid कि स्वचालित रूप से के साथ बनाया नए उपयोगकर्ताओं के लिए आवंटित किया जाएगा नियंत्रित करता है useradd
स्टीफन टॉसेट

2
यह शायद 2 ^ 32 (2 के बजाय 4 बिलियन) है। RHEL UID पर 4,294,967,295 (2 ^ 32-1) अक्सर "अमान्य मान" UID के लिए आरक्षित होता है, और 4,294,967,294 (2 ^ 32-2) कुछ ऑपरेटिंग सिस्टम में nfsnobody उपयोगकर्ता के लिए आरक्षित होता है। इस प्रकार अधिकतम गैर-आरक्षित मूल्य 4,294,967,293 (2 ^ 32-3) है
तेहनिकागोप

4

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 टाइप का पता लगाने देता है। चूंकि आपको बाइट्स में आकार की आवश्यकता होती है, इसलिए आपका सबसे अच्छा विकल्प विनिर्देश के अनुसार टाइप किए गए नाम को पार्स कर रहा है 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इस मूल्य पर स्विच करने के लिए बेहतर हो सकता है )।


1
मेरे सिस्टम पर (Ubuntu 12.04) और अन्य डेबियन आधारित सिस्टम हेडर फ़ाइल है: /usr/include/$(gcc -print-multiarch)/bits/typesizes.hया वैकल्पिक रूप से:/usr/include/$(dpkg-architecture -qDEB_HOST_MULTIARCH)/bits/typesizes.h
pabouk

1
उन glibc फ़ाइलों के होने का अर्थ होगा कि एक संकलक उपलब्ध है। तो एक सकता है # शामिल <sys / types.h> का उपयोग करने की uid_t और परिणाम प्रिंट ( printf ( "uid_t:% d बाइट (% d बिट्स) \ n", sizeof (uid_t), sizeof (uid_t) * 8 ); )
टेहनकॉर्ग

3

यह एक दिलचस्प सवाल है। मुझे आश्चर्य होगा कि इसे निर्धारित करने के लिए एक मानक, पोर्टेबल विधि थी।

मेरे पास लिनक्स बॉक्स नहीं है, लेकिन idFreeBSD 8.0 पर कमांड शून्य पर वापस आ जाती है:

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

मुझे यकीन है कि यह अपरिभाषित व्यवहार है, लेकिन मैं चाहूंगा कि अधिकांश संस्करण idया तो शून्य के साथ 65'536(यदि 16-बिट यूआईडी) और 4'294'967'296या त्रुटि से बाहर निकले, अगर आप सिस्टम सीमा से परे चले गए।


3

में इस लिंक प्रश्न पूछा जाता है और एक प्रत्युत्तर एक हस्ताक्षरित लंबे पूर्णांक सवाल उपयोग में प्रणाली निर्धारित करने के लिए एक परीक्षण और त्रुटि विधि का उपयोग करता है, 31 बिट छोड़ने 2,147,483,647 की एक अधिकतम के साथ, मान संग्रहीत।

# groupadd -g 42949672950 testgrp
# more /etc/group
testgrp:*:2147483647:
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.