วิธีรับข้อมูล dmidecode ที่ไม่มีสิทธิ์รูท


16

ฉันกำลังเขียนโปรแกรมที่แสดงข้อมูลระบบต่าง ๆ (บนระบบ CentOS) ตัวอย่างเช่นประเภทโปรเซสเซอร์และความเร็ว (จาก/proc/cpuinfo), เวลาบูตล่าสุด (คำนวณจาก/proc/uptime), ที่อยู่ IP (จาก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 มีสิทธิ์อ่านอย่างเดียวสำหรับ / dev / mem - ดูเหมือนว่ามีการเขียนที่เกี่ยวข้องเพื่อรับข้อมูล BIOS

ดังนั้นตัวเลือกอื่น ๆ :

  1. ใช้ sudo
  2. ใช้แหล่งข้อมูลอื่น ๆ (เช่น / proc / meminfo)
  3. ใช้ init-script ที่เขียนเอาต์พุตสแตติกของ 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ที่จะได้รับสิ่งที่คุณต้องการ
Mike S

6
  1. ฉันสามารถอ่านข้อมูล DMI /sys/class/dmi/id/ภายใต้ผู้ใช้ ไม่รวมหมายเลขซีเรียล (ซึ่งต้องใช้สิทธิ์รูทในการอ่าน)

    ฉันเดาว่านี่เป็นพฤติกรรมที่ตั้งใจโดยนักพัฒนาเคอร์เนลที่เป็นส่วนตัว

  2. เกี่ยวกับdmesg: dmesgเป็นคำสั่งสำหรับการเข้าถึงบัฟเฟอร์เคอร์เนล Ring buffer หมายถึงข้อมูลที่เก่ากว่าถูกเขียนทับโดยอันที่ใหม่กว่าเมื่อบัฟเฟอร์นั้นเป็น "overflow" และนี่คือการอ่านเอาต์พุตการดีบักเคอร์เนลโมดูลซึ่งไม่ได้ตั้งใจจะแยกวิเคราะห์

  3. ในการเข้าถึงเอาต์พุตเคอร์เนลด้วยการsystemdรัน:

    journalctl --quiet --system --boot SYSLOG_IDENTIFIER=kernel
    
  4. เกี่ยวกับคำตอบของดาวิดโฮเมอร์และนิลส์ : ไฟล์/dev/memไม่เพียง แต่ให้ข้อมูลหน่วยความจำ แต่จะแมปหน่วยความจำกายภาพทั้งหมดลงใน userspace ดังนั้นหนึ่งสามารถเข้าถึงที่อยู่หน่วยความจำ DMI ผ่านมัน (และทำสิ่งที่น่ารังเกียจมากขึ้น)

  5. เกี่ยวกับchgrpและchmod g+sของdmidecodeในNils'คำตอบ: ผมคิดว่านี้จะไม่ทำงานตามที่ตั้งใจไว้เพราะประหยัด GID กับchmod g+sไม่ได้ทำให้dmidecodeการใช้งานมันเป็นสิทธิ์ของใหม่ dmidecodeต้องโทรsetegidเพื่อตั้งค่ารหัสกลุ่มที่มีประสิทธิภาพก่อนจึงจะสามารถเข้าถึง/dev/memได้ ตัดสินจากซอร์สโค้ดของมันdmidecodeไม่ทำอย่างนั้น


1
นอกจาก 3 .: การเข้าถึงการส่งออกเคอร์เนลในระบบโดยไม่เพียงแค่อ่านsystemd /var/log/kern.logหากไม่มีไฟล์ดังกล่าวขณะที่ระบบยังใช้syslogdงานอยู่ให้ลองค้นหาkern.*รายการ/etc/syslog.confเพื่อค้นหาตำแหน่งของไฟล์
Ruslan

5

ลองใช้ dmesg ฉันสามารถรับข้อมูลที่ฉันต้องการด้วยวิธีนี้ด้วยบัญชีผู้ใช้ทั่วไป


ไม่แน่ใจว่าทำไมคุณถึงได้ลงคะแนน ฉันได้ตอบกลับแบบละเอียดมากขึ้นตามโซลูชันของคุณเพื่อให้ทุกคนเห็น ฉันคิดว่าทางออกของคุณดี
เก่ง

4

เรากำลังใช้ DMIDecode เพื่ออ่านข้อมูลจากระบบลีนุกซ์ระยะไกลและยังไม่พบวิธีแก้ปัญหาสำหรับเรื่องนี้ ฉันบันทึกการโทรบนโฮมเพจ dmidecode ที่ถามเกี่ยวกับสิ่งนี้ ...

การใช้คำสั่งระบบ dmidecode -t ให้ข้อผิดพลาด "/ dev / mem: การอนุญาตถูกปฏิเสธ" ซึ่งเป็นปัญหาเนื่องจากเราไม่ต้องการข้อมูลหน่วยความจำ (เพียงผู้ผลิตรุ่นและหมายเลขซีเรียล)

ฉันสังเกตเห็นว่าคำสั่ง smbios ทำงานบน SunOS ทำงานได้ดีสำหรับข้อมูลนี้โดยไม่จำเป็นต้องมีสิทธิ์รูท

ในตอนนี้ฉันจะแทนที่เอกสารของเราที่ระบุว่า "ใช้บัญชีที่ระบุด้วยสิทธิ์ที่น้อยที่สุด" ด้วย "ข้อมูลประจำตัวของผู้ใช้ราก"


4

lshal มีข้อมูลเดียวกันจำนวนมากและไม่จำเป็นต้องใช้สิทธิ์รูท


ฉันไม่แน่ใจว่าทำไมสิ่งนี้ถึงได้ลงคะแนนเสียง grepping มันให้ข้อมูลที่ฉันต้องการlshal | grep system.productสำหรับชื่อระบบและแม้แต่แท็กบริการของ Dell ด้วยlshal | grep smbios.system.serial
Mark Booth

2
@ MarkBooth อาจเป็นเพราะ HAL เลิกใช้แล้วและไม่ได้ส่งในการแจกแจงที่ทันสมัย
Ruslan

lshalในที่สุดก็หายไปอย่างสมบูรณ์ใน RHEL7 และตอนนี้ฉันใช้sudo cat /sys/devices/virtual/dmi/id/chassis_serialเพื่อรับที่แท็กบริการของ Dell แต่สิ่งนี้ใช้ได้เฉพาะเมื่อฉันเข้าถึงcatsudoers
Mark Booth

4

ฉันไม่แน่ใจว่าทำไม @mtneagle ลงคะแนน

สามรายการที่ต้องการ OP คือ:

ประเภทแพลตฟอร์ม ( 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 หรือเซิร์ฟเวอร์ใน Xen guest)

ฉันคิดถึงบางสิ่งที่ชัดเจนหรือไม่


อัปเดต:ขอบคุณ @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สิ่งที่ชอบ
Ruslan

ขอบคุณ - ฉันหวังว่าคุณจะไม่รังเกียจฉันได้รวมความคิดเห็นของคุณไว้ในคำตอบของฉัน (พร้อมเครดิต)
เก่ง

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
Lekensteyn

cat /sys/devices/virtual/dmi/id/bios_version... Voila! แต่ YMMV ไม่ใช่ทุกสถาปัตยกรรมที่มีเส้นทางนี้ x86_64 Intel ควร
Mike S

2

บริการลีนุกซ์ของเราไม่ทำงานเหมือนรูท ในสคริปต์การติดตั้งโพสต์ RPM (ซึ่งทำงานเป็นรูท) เราติดตั้งไฟล์ /etc/sudo.d และตั้งค่าไฟล์ปฏิบัติการบางส่วนของเรา (เช่นสำหรับเครือข่ายสิทธิ์การออกอากาศ)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.