रूट विशेषाधिकार के बिना dmidecode जानकारी कैसे प्राप्त करें?


16

मैं एक प्रोग्राम लिख रहा हूं जो विभिन्न सिस्टम जानकारी (एक CentOS सिस्टम पर) प्रदर्शित करता है। उदाहरण के लिए, प्रोसेसर प्रकार और गति (से /proc/cpuinfo), अंतिम बूट समय (से गणना /proc/uptime), आईपी पता ( ifconfigआउटपुट से), और स्थापित प्रिंटर ( lpstatआउटपुट से) की एक सूची ।

वर्तमान में, dmidecodeकार्यक्रम से डेटा के कई टुकड़े प्राप्त होते हैं :

  • प्लेटफ़ॉर्म प्रकार ( dmidecode -s system-product-name)
  • BIOS संस्करण ( dmidecode -s bios-version)
  • भौतिक स्मृति की मात्रा ( dmidecode -t17 | grep Size)

ये केवल तभी उपलब्ध हैं जब मेरा प्रोग्राम रूट के रूप में चलाया जाता है (क्योंकि अन्यथा dmidecodeउपप्रकार एक /dev/mem: Permission deniedत्रुटि के साथ विफल हो जाता है )। क्या यह जानकारी प्राप्त करने का कोई वैकल्पिक तरीका है, जो एक सामान्य उपयोगकर्ता तक पहुँच सकता है?

जवाबों:


4

मैंने अभी-अभी अपने CentOS 5 सिस्टम पर जाँच की है:

chgrp kmem /usr/sbin/dmidecode
chmod g+s /usr/sbin/dmidecode

यह काम करना अभी भी संभव नहीं है dmidecode काम करना - समूह kmem के पास केवल / देव / मेम के लिए पढ़ने के अधिकार हैं - ऐसा लगता है कि BIOS जानकारी प्राप्त करने के लिए एक लेखन शामिल है।

तो कुछ अन्य विकल्प:

  1. सुडो का उपयोग करें
  2. अन्य सूचना स्रोतों का उपयोग करें (जैसे / proc / meminfo)
  3. एक init- स्क्रिप्ट का उपयोग करें जो dmidecode के स्थिर आउटपुट को विश्व-पठनीय फ़ाइल में लिखती है

6

प्रस्तुत जानकारी में से कुछ dmidecodeपर उपलब्ध है /sys/devices/virtual/dmi/id

अन्य जानकारी का विश्लेषण करके प्राप्त किया जा सकता है /proc/cpuinfo, /proc/meminfoया /sys/system/node/node0/meminfo


1
के लिए +1 /sys/devices/virtual/dmi/id। प्लेटफ़ॉर्म-विशिष्ट जानकारी के बहुत सारे उपलब्ध हैं। एक आसान स्क्रिप्ट के लिए, unix.stackexchange.com/questions/75750/… देखें । सिस्टम की जानकारी के लिए, आपका अन्य वाक्य भी अच्छा है। उपयोगिताओं के बहुत सारे हैं जैसे freeया यहां तक htopकि आपको वह मिल सकता है जो आप चाहते हैं।
माइक एस

6
  1. मैं उपयोगकर्ता के रूप में DMI जानकारी पढ़ सकता हूँ /sys/class/dmi/id/। सीरियल नंबर (जिसमें पढ़ने के लिए रूट विशेषाधिकार की आवश्यकता होती है) शामिल नहीं हैं।

    मुझे लगता है कि यह गोपनीयता जागरूक कर्नेल डेवलपर्स द्वारा व्यवहार का इरादा है।

  2. के बारे में dmesg: dmesgकर्नेल रिंग बफर तक पहुँचने के लिए एक कमांड है। जब बफर "अतिप्रवाह" होता है, तो रिंग बफ़र का अर्थ है कि पुरानी जानकारी को नए द्वारा अधिलेखित कर दिया जाता है। इसके अलावा यह कर्नेल मॉड्यूल डिबग आउटपुट को पढ़ रहा है जो कभी भी पार्स करने योग्य नहीं था।

  3. systemdचलाने के साथ कर्नेल आउटपुट तक पहुँचने के लिए:

    journalctl --quiet --system --boot SYSLOG_IDENTIFIER=kernel
    
  4. के बारे में डेविड-होमर और निल्स ' उत्तर: फ़ाइल /dev/memबस स्मृति जानकारी नहीं देता है, लेकिन यूज़रस्पेस में पूरी भौतिक स्मृति मैप करता है। इसलिए कोई इसके माध्यम से DMI मेमोरी एड्रेस तक पहुंच सकता है (और बहुत अधिक गंदा काम करता है)।

  5. के बारे में chgrpऔर chmod g+sके dmidecodeमें निल्स ' जवाब: मैं के रूप में इस काम नहीं होगा लगता है कि इरादा है, क्योंकि gid बचत के साथ chmod g+sनहीं है dmidecodeयह नए विशेषाधिकार का उपयोग करें। उपयोग करने से पहले इसे प्रभावी समूह आईडी सेट करने के dmidecodeलिए कॉल setegidकरना होगा /dev/mem। यह स्रोत कोड को देखते हुए, dmidecodeऐसा नहीं करता है।


1
3 के अलावा: systemdबस पढ़ने के बिना सिस्टम पर कर्नेल आउटपुट तक पहुँचने के लिए /var/log/kern.log। यदि सिस्टम का उपयोग करते समय ऐसी कोई फ़ाइल नहीं है syslogd, तो उसके स्थान का पता लगाने के लिए kern.*प्रविष्टियों की तलाश करें /etc/syslog.conf
रुस्लान

5

Dmesg की कोशिश करो। मैं एक नियमित उपयोगकर्ता खाते के साथ इस तरह की जानकारी चाहता था।


यकीन नहीं होता कि आपको वोट क्यों दिया गया। मैंने आपके समाधान के आधार पर सभी के लिए अधिक क्रिया प्रतिक्रिया देखी है। मुझे लगता है कि आपका समाधान ठीक है।
वैली

4

हम दूरस्थ लिनक्स सिस्टम से जानकारी पढ़ने के लिए DMIDecode का उपयोग कर रहे हैं और अभी तक इस पर वर्कअराउंड नहीं मिला है। मैंने इस बारे में पूछते हुए dmidecode होम पेज पर कॉल लॉग किया है ...

कमांड dmidecode -t सिस्टम का उपयोग करने से त्रुटि मिलती है "/ dev / mem: अनुमति अस्वीकृत" जो एक समस्या है क्योंकि हम मेमोरी की जानकारी नहीं चाहते हैं (बस निर्माता, मॉडल और सीरियल नंबर)।

मुझे लगता है कि SunOS पर चल रहे smbios कमांड को रूट विशेषाधिकार की आवश्यकता के बिना इस जानकारी के लिए ठीक काम करता है।

अभी के लिए मैं "उपयोगकर्ता रूट क्रेडेंशियल्स" के साथ "कम से कम आवश्यक विशेषाधिकार के साथ एक विशिष्ट खाते का उपयोग करने" के लिए हमारे दस्तावेज को बदलने जा रहा हूं।


4

lshal इसमें बहुत सारी जानकारी शामिल है और इसे रूट विशेषाधिकारों की आवश्यकता नहीं है।


मुझे यकीन नहीं है कि इसे क्यों वोट दिया गया था, इसे पकड़कर मुझे lshal | grep system.productसिस्टम नाम के लिए आवश्यक जानकारी , और यहां तक ​​कि dell सेवा टैग के साथlshal | grep smbios.system.serial
मार्क बूथ

2
@MarkBooth शायद इसलिए कि एचएएल को पदावनत किया गया है और आधुनिक वितरण में नहीं भेजा गया है।
रुस्लान

lshalअंततः आरएचईएल 7 में पूरी तरह से चला गया और अब मैं sudo cat /sys/devices/virtual/dmi/id/chassis_serialडेल सेवा टैग पर प्राप्त करने के लिए उपयोग कर रहा हूं , लेकिन यह केवल उसी तरह काम करता है जैसे मेरे पास catसुडर के माध्यम से पहुंच है ।
मार्क बूथ

4

मुझे यकीन नहीं है कि @mtneagle ने मतदान क्यों किया।

ओपी चाहते थे तीन आइटम हैं:

प्लेटफ़ॉर्म प्रकार ( dmidecode -s system-product-name)
BIOS संस्करण ( dmidecode -s bios-version)
भौतिक मेमोरी की मात्रा ( dmidecode -t17 | grep Size)

हम इनमें से प्रत्येक को इस प्रकार प्राप्त कर सकते हैं:

dmesg | grep "DMI:" | cut -c "6-" | cut -d "," -f "1"
dmesg | grep "DMI:" | cut -c "6-" | cut -d "," -f "2"
dmesg | grep "Memory:" | cut -d '/' -f '2-' | cut -d ' ' -f '1'

(या मेरे पास मौजूद 4 विभिन्न हार्डवेयर सर्वरों पर कम से कम काम करते हैं, और एक्सएमएल अतिथि पर BIOS या सर्वर प्रकार के लिए साफ-साफ कुछ भी नहीं लौटाते हैं।)

क्या मुझे कुछ स्पष्ट याद आया?


अपडेट: मेरे द्वारा याद किए गए स्पष्ट को इंगित करने के लिए @Ruslan का धन्यवाद।

का हवाला देते हुए:

हाँ आपके पास। कर्नेल संदेश रिंग बफ़र में संग्रहीत होते हैं। जब बहुत सी पंक्तियाँ छपी होती हैं, तो सबसे पहले हटा दी जाती हैं।

इसलिए यदि आपकी मशीन ने कई हफ्तों तक काम किया है, और आपने इसे कम से कम हर दिन निलंबित / फिर से शुरू किया है, तो उच्च संभावना यह है कि आपके लिए यहां दी गई जानकारी बफर में नहीं रह जाएगी।

(मेरे पास 18 दिनों के अपटाइम के साथ ऐसी स्थिति है।) इस पर ध्यान देना बेहतर हो सकता है /var/log/kern.log

कुछ इस तरह grep DMI: /var/log/kern.log | tail -n1


3
हाँ आपके पास। कर्नेल संदेश रिंग बफ़र में संग्रहीत होते हैं। जब बहुत सी पंक्तियाँ छपी होती हैं, तो सबसे पहले हटा दी जाती हैं। इसलिए यदि आपकी मशीन ने कई हफ्तों तक काम किया है, और आपने कम से कम हर दिन इसे निलंबित / फिर से शुरू किया है, तो उच्च संभावना है कि आपके grepलिए यहां की जानकारी बफर में नहीं होगी। (मेरे पास 18 दिनों के अपटाइम के साथ ऐसी स्थिति है।) इस पर ध्यान देना बेहतर हो सकता है /var/log/kern.log। कुछ इस तरह grep DMI: /var/log/kern.log | tail -n1
रुस्लान

धन्यवाद - मुझे आशा है कि आपको कोई आपत्ति नहीं है, मैंने आपकी टिप्पणी को मेरे उत्तर में (क्रेडिट के साथ) शामिल किया है।
वैली

2

भौतिक मेमोरी की कुल राशि प्राप्त करने के लिए, आप पार्स /proc/meminfo, freeऔर vmstat, आदि कर सकते हैं। आप कर्नेल संदेश बफर को पार्स भी कर सकते हैं, क्योंकि यह 0 समय पर इसके बारे में बात करता है।

BIOS संस्करण अधिक कठिन है, मेरा मानना ​​है कि यह गैर-रूट उपयोगकर्ता के रूप में संभव है, लेकिन मैं गलत हो सकता हूं। यह संभव है कि यह (और सिस्टम उत्पाद का नाम) कहीं उजागर हो, शायद में /sys/या /proc/, लेकिन मुझे कुछ भी नहीं मिल रहा है।


2
BIOS का भी उल्लेख किया गया है, इसलिए कर्नेल लॉग से परामर्श करें या dmesgयदि यह बहुत अधिक नहीं भरा गया था। उदाहरण पंक्ति:[ 0.000000] DMI: CLEVO CO. B7130 /B7130 , BIOS 6.00 08/27/2010
लेकेनस्टेएन

cat /sys/devices/virtual/dmi/id/bios_version... देखा '! लेकिन YMMV। सभी आर्किटेक्चर के पास यह रास्ता नहीं है। x86_64 इंटेल चाहिए।
माइक एस

2

हमारी लिनक्स सेवाएं रूट के रूप में नहीं चलती हैं। RPM पोस्ट इंस्‍टॉल स्क्रिप्ट में (जो रूट के रूप में चलता है) हम /etc/sudo.d फ़ाइल को इंस्‍टॉल करते हैं और अपने कुछ निष्पादक (जैसे नेटवर्क प्रसारण निजीकरण) सेट करते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.