आरएचईएल/सेंटोस 8.एक्स, रूबी 2.5.5, आईआरबी 0.9.6

हमारे पास एक विशेष सेट अप है जो उपयोगकर्ता और समूह की जानकारी को /usr/local/etc/[user|group] में रखता है और उस जानकारी को तदनुसार /var/db/[group|passwd].db में जोड़ने के लिए एक कस्टम मेकफ़ाइल रखता है।

मैं लॉगिन के बाद रूबी में उन समूहों की सूची प्राप्त करने का प्रयास कर रहा हूं जिनसे उपयोगकर्ता संबंधित है।

मैं भाषा के लिए अपेक्षाकृत नया हूं, और अभी हाल ही में Etc मॉड्यूल लेकिन ऐसा लगता है कि यह विशेष रूप से /etc/ फाइल सिस्टम के साथ काम करता है। अपमानजनक टीबीएच नहीं।

क्या बर्कले डीबी जानकारी को /var/db में एक्सेस करने का कोई आसान तरीका है या क्या मुझे यह जानकारी प्राप्त करने के लिए /usr/local/etc/group फ़ाइल के माध्यम से पुनरावृति करनी होगी?

0
datakid 28 सितंबर 2020, 04:32

1 उत्तर

सबसे बढ़िया उत्तर

मुझे संदेह है कि उस मॉड्यूल का दस्तावेज़ीकरण अत्यधिक सरलीकृत, अत्यधिक पुराना, या दोनों है। मुझे लगभग 100% यकीन है कि Etc सिस्टम फ़ाइलों को स्वयं बंद करने और पार्स करने के बजाय OS द्वारा प्रदत्त मानक लाइब्रेरी फ़ंक्शंस का उपयोग करेगा। (रूबी डेवलपर्स केवल पॉज़िक्स फ़ंक्शन को कॉल करने के बजाय, उनके द्वारा समर्थित प्रत्येक ओएस की कॉन्फ़िगरेशन फ़ाइलों के लिए पार्सर्स क्यों लिखेंगे?)

आप strace का उपयोग करके इस संदेह की पुष्टि कर सकते हैं।

यदि आप देखें कि रूबी Etc मॉड्यूल कैसे संरचित है, तो यह POSIX कार्यों के लिए 1:1 मैप करता है:

  • Etc::gegtrent: अगली समूह प्रविष्टि प्राप्त करता है।
  • Etc::endgtrent: समूहों को पुनरावृत्त करना बंद कर देता है।
  • Etc::settrent: पुनरावृत्ति को रीसेट करता है।

यहाँ तुलना के लिए POSIX कार्य हैं:

endgrent , getgrent , setgrent - समूह डेटाबेस प्रविष्टि कार्य

मेरे मामले में, मैं macOS पर इसका परीक्षण कर रहा हूं (जिसमें पहले से ही विशेष उपयोगकर्ता हैंडलिंग है), लेकिन इसके अलावा, मैंने इसे अपनी कंपनी के लैपटॉप पर परीक्षण किया, जो कि macOS एक Microsoft ActiveDirectory डोमेन से जुड़ा है। मेरे उपयोगकर्ता खाते और उसके समूह का उल्लेख /etc/passwd या /etc/group में भी नहीं किया गया है, और फिर भी, मैं उन्हें Etc के साथ आसानी से पढ़ सकता हूं। मुझे पूरा यकीन है कि रूबी डेवलपर्स ने मेरे व्यक्तिगत अजीब उपयोग के मामले को समायोजित करने के लिए ActiveDirector को लागू नहीं किया है, इसलिए इसे सिस्टम फ़ंक्शंस का उपयोग करना चाहिए।

तो, यदि आपके पास उदा। a uid और यह जानना चाहते हैं कि यह किस समूह से संबंधित है, आपको पहले इसका नाम प्राप्त करना होगा, और फिर समूहों को खोजना होगा। दुर्भाग्य से, ऐसा लगता है कि प्रदान किए गए इटरेटर रैपर सामान्य मुहावरे का समर्थन नहीं करते हैं जो ब्लॉक की आपूर्ति नहीं करते हैं, एक Enumerator देता है, इसलिए आपको स्वयं एक बनाना होगा।

require 'etc'

uid = 0 # for example

username = Etc.getpwuid(uid).name

groups = Etc.enum_for(:group).select {|group| group.mem.include?(username) }

p groups
1
Jörg W Mittag 28 सितंबर 2020, 09:20