Bagaimana cara mendapatkan informasi dmidecode tanpa hak akses root?


16

Saya sedang menulis sebuah program yang menampilkan berbagai informasi sistem (pada sistem CentOS). Misalnya, jenis dan kecepatan prosesor (dari /proc/cpuinfo), waktu boot terakhir (dihitung dari /proc/uptime), alamat IP (dari ifconfigoutput), dan daftar printer yang diinstal (dari lpstatoutput).

Saat ini, beberapa bagian data diperoleh dari dmidecodeprogram:

  • Jenis platform ( dmidecode -s system-product-name)
  • Versi BIOS ( dmidecode -s bios-version)
  • Jumlah memori fisik ( dmidecode -t17 | grep Size)

Ini hanya tersedia jika program saya dijalankan sebagai root (karena kalau tidak, dmidecodesubproses gagal dengan /dev/mem: Permission deniedkesalahan). Apakah ada cara alternatif untuk mendapatkan informasi ini, yang dapat diakses oleh pengguna normal?

Jawaban:


4

Saya baru saja memeriksa sistem CentOS 5 saya - setelah:

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

Masih tidak mungkin untuk membuat dmidecode berfungsi - kmem grup hanya memiliki hak baca untuk / dev / mem - sepertinya ada penulisan yang terlibat untuk mendapatkan informasi BIOS.

Jadi beberapa opsi lain:

  1. Gunakan sudo
  2. Gunakan sumber informasi lain (mis. / Proc / meminfo)
  3. Gunakan skrip init yang menulis output statis dari dmidecode ke file yang dapat dibaca dunia

6

Beberapa informasi yang disajikan oleh dmidecodetersedia di /sys/devices/virtual/dmi/id.

Informasi lain dapat diperoleh dengan menganalisis /proc/cpuinfo, /proc/meminfoatau /sys/system/node/node0/meminfo.


1
+1 untuk /sys/devices/virtual/dmi/id. Banyak informasi spesifik platform tersedia di sana. Untuk skrip praktis, lihat unix.stackexchange.com/questions/75750/… . Untuk informasi sistem, kalimat Anda yang lain juga baik. Ada banyak utilitas seperti freeatau bahkan htopyang dapat memberi Anda apa yang Anda inginkan.
Mike S

6
  1. Saya dapat membaca informasi DMI sebagai Pengguna di bawah /sys/class/dmi/id/. Tidak termasuk nomor seri (yang membutuhkan hak akses root untuk membaca).

    Saya kira ini adalah perilaku yang dimaksudkan oleh pengembang kernel yang sadar privasi.

  2. Mengenai dmesg: dmesgadalah perintah untuk mengakses buffer cincin kernel. Ring buffer menyiratkan informasi yang lebih lama ditimpa oleh yang lebih baru ketika buffer "meluap". Juga ini membaca output debug modul kernel yang tidak pernah dimaksudkan untuk dapat diuraikan.

  3. Untuk mengakses output kernel dengan systemdrun:

    journalctl --quiet --system --boot SYSLOG_IDENTIFIER=kernel
    
  4. Mengenai jawaban david-homer dan nils ' : File /dev/memtidak hanya memberikan informasi memori, tetapi memetakan seluruh memori fisik ke dalam ruang pengguna. Oleh karena itu orang dapat mengakses alamat memori DMI melalui itu (dan melakukan banyak hal yang lebih buruk).

  5. Mengenai chgrpdan chmod g+sdari dmidecodedalam nils' jawaban: Saya kira ini tidak akan bekerja sebagaimana dimaksud, karena menghemat gid dengan chmod g+stidak membuat dmidecodemenggunakan itu hak baru. dmidecodeharus menelepon setegiduntuk mengatur id grup yang efektif sebelum dapat mengakses /dev/mem. Menilai dari kode sumbernya, dmidecodejangan lakukan itu.


1
Tambahan ke 3 .: Untuk mengakses output kernel pada sistem tanpa systemdhanya membaca /var/log/kern.log. Jika tidak ada file seperti itu saat sistem masih menggunakan syslogd, coba cari kern.*entri /etc/syslog.confuntuk mengetahui lokasinya.
Ruslan

5

Coba dmesg. Saya bisa mendapatkan info yang saya inginkan dengan akun pengguna biasa.


Tidak yakin mengapa Anda ditolak. Saya telah menempatkan respons yang lebih verbal berdasarkan solusi Anda untuk dilihat semua orang. Saya pikir solusi Anda baik-baik saja.
wally

4

Kami menggunakan DMIDecode untuk membaca informasi dari sistem Linux jarak jauh dan belum menemukan solusi untuk ini. Saya telah mencatat panggilan di beranda dmidecode yang menanyakan tentang ini ...

Menggunakan perintah dmidecode -t sistem memberikan kesalahan "/ dev / mem: Izin ditolak" yang merupakan masalah karena kita tidak ingin informasi memori (hanya pabrikan, model dan nomor seri).

Saya perhatikan bahwa perintah smbios yang dijalankan pada SunOS berfungsi dengan baik untuk informasi ini tanpa memerlukan hak akses root.

Untuk saat ini saya akan mengganti dokumentasi kami yang menyatakan untuk "menggunakan akun tertentu dengan hak istimewa yang paling tidak dibutuhkan" dengan "kredensial root pengguna".


4

lshal berisi banyak informasi yang sama dan tidak memerlukan hak akses root.


Saya tidak yakin mengapa ini ditolak, tetapi itu memberi saya informasi persis yang saya butuhkan lshal | grep system.productuntuk nama sistem, dan bahkan tag layanan dell denganlshal | grep smbios.system.serial
Mark Booth

2
@MarkBooth mungkin karena HAL sudah usang dan tidak dikirim dalam distribusi modern.
Ruslan

lshalakhirnya pergi sepenuhnya di RHEL7 dan saya sekarang menggunakan sudo cat /sys/devices/virtual/dmi/id/chassis_serialuntuk mendapatkan tag layanan Dell, tetapi ini hanya berfungsi karena saya memiliki akses ke catmelalui sudoers.
Mark Booth

4

Saya tidak yakin mengapa @mtneagle terpilih.

Tiga item yang diinginkan OP adalah:

Jenis platform ( dmidecode -s system-product-name)
Versi BIOS ( dmidecode -s bios-version)
Jumlah memori fisik ( dmidecode -t17 | grep Size)

Kita bisa mendapatkan masing-masing ini sebagai berikut:

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'

(Atau setidaknya mereka bekerja pada 4 server perangkat keras berbeda yang saya miliki, dan tidak mengembalikan apa pun untuk jenis BIOS atau server pada tamu Xen.)

Apakah saya melewatkan sesuatu yang jelas?


Pembaruan: Terima kasih kepada @Ruslan karena menunjukkan yang sudah saya lewatkan.

Mengutip:

Ya, sudah. Pesan-pesan kernel disimpan dalam buffer cincin. Ketika terlalu banyak garis telah dicetak, yang pertama dihapus.

Jadi, jika mesin Anda telah bekerja selama beberapa minggu, dan Anda menangguhkan / melanjutkannya setidaknya setiap hari, kemungkinan besar bahwa informasi yang Anda terima di sini tidak lagi ada di buffer.

(Saya memiliki situasi seperti ini dengan waktu kerja 18 hari di sini.) Mungkin lebih baik untuk melihat ke dalam /var/log/kern.log

Sesuatu seperti grep DMI: /var/log/kern.log | tail -n1


3
Ya, sudah. Pesan-pesan kernel disimpan dalam buffer cincin. Ketika terlalu banyak garis telah dicetak, yang pertama dihapus. Jadi, jika mesin Anda telah bekerja selama beberapa minggu, dan Anda menangguhkan / melanjutkannya setidaknya setiap hari, kemungkinan besar bahwa informasi yang Anda masukkan di grepsini tidak lagi ada di buffer. (Saya memiliki situasi seperti ini dengan waktu kerja 18 hari di sini.) Mungkin lebih baik untuk melihat ke dalam /var/log/kern.log. Sesuatu seperti grep DMI: /var/log/kern.log | tail -n1.
Ruslan

Terima kasih - Saya harap Anda tidak keberatan, saya sudah memasukkan komentar Anda dalam jawaban saya (dengan kredit).
Wally

2

Untuk mendapatkan jumlah total memori fisik, Anda dapat mengurai /proc/meminfo, free, vmstat, dll Anda bisa juga mengurai buffer pesan kernel, karena itu berbicara tentang hal itu pada 0 kali.

Versi BIOS lebih sulit, saya tidak percaya ini mungkin sebagai pengguna non-root, tapi saya mungkin salah. Mungkin saja (dan nama produk sistem) terpapar di suatu tempat, mungkin di /sys/atau /proc/, tapi saya tidak dapat menemukan apa pun.


2
BIOS juga disebutkan, jadi lihat log kernel atau dmesgjika tidak diisi terlalu banyak. Contoh baris:[ 0.000000] DMI: CLEVO CO. B7130 /B7130 , BIOS 6.00 08/27/2010
Lekensteyn

cat /sys/devices/virtual/dmi/id/bios_version... Voila '! Tapi YMMV. Tidak semua arsitektur memiliki jalur ini. x86_64 Intel seharusnya.
Mike S

2

Layanan Linux kami tidak berjalan sebagai root. Dalam skrip instalasi pos RPM (yang TIDAK dijalankan sebagai root) kami memasang file /etc/sudo.d dan mengatur beberapa executable kami (mis. Untuk hak istimewa siaran jaringan).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.