Come ottenere informazioni dmidecode senza i privilegi di root?


16

Sto scrivendo un programma che visualizza varie informazioni di sistema (su un sistema CentOS). Ad esempio, il tipo e la velocità del processore (da /proc/cpuinfo), l'ultimo tempo di avvio (calcolato da /proc/uptime), l'indirizzo IP ( ifconfigdall'output) e un elenco di stampanti installate ( lpstatdall'output).

Attualmente, dal dmidecodeprogramma vengono ottenuti diversi dati :

  • Il tipo di piattaforma ( dmidecode -s system-product-name)
  • La versione del BIOS ( dmidecode -s bios-version)
  • La quantità di memoria fisica ( dmidecode -t17 | grep Size)

Questi sono disponibili solo se il mio programma viene eseguito come root (perché altrimenti il dmidecodesottoprocesso fallisce con un /dev/mem: Permission deniederrore). Esiste un modo alternativo per ottenere queste informazioni, a cui un normale utente può accedere?

Risposte:


4

Ho appena controllato il mio sistema CentOS 5 - dopo:

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

Non è ancora possibile far funzionare dmidecode - il gruppo kmem ha solo diritti di lettura per / dev / mem - sembra che ci sia una scrittura coinvolta per accedere alle informazioni del BIOS.

Quindi alcune altre opzioni:

  1. Usa sudo
  2. Utilizza altre fonti di informazioni (ad es. / Proc / meminfo)
  3. Utilizzare uno script init che scriva l'output statico di dmidecode in un file leggibile in tutto il mondo

6

Alcune delle informazioni presentate da dmidecodesono disponibili all'indirizzo /sys/devices/virtual/dmi/id.

Altre informazioni possono essere ottenute analizzando /proc/cpuinfo, /proc/meminfoo /sys/system/node/node0/meminfo.


1
+1 per /sys/devices/virtual/dmi/id. Molte informazioni specifiche della piattaforma sono disponibili qui. Per uno script utile, consultare unix.stackexchange.com/questions/75750/… . Per informazioni sul sistema, anche l'altra frase è buona. Ci sono un sacco di programmi di utilità come freeo addirittura htopche possono ottenere ciò che vuoi.
Mike S,

6
  1. Posso leggere le informazioni DMI come Utente sotto /sys/class/dmi/id/. Non inclusi i numeri di serie (che richiedono i privilegi di root per la lettura).

    Immagino che questo sia un comportamento previsto dagli sviluppatori del kernel consapevoli della privacy.

  2. Riguardo dmesg: dmesgè un comando per accedere al buffer dell'anello del kernel. Il buffer ad anello implica che le informazioni più vecchie vengono sovrascritte da quelle più recenti quando il buffer "trabocca". Anche questo sta leggendo l'output di debug del modulo del kernel che non è mai stato pensato per essere analizzabile.

  3. Per accedere all'output del kernel con systemdrun:

    journalctl --quiet --system --boot SYSLOG_IDENTIFIER=kernel
    
  4. Per quanto riguarda le risposte di David-Homer e Nils : il file /dev/memnon fornisce semplicemente informazioni sulla memoria, ma mappa l'intera memoria fisica nello spazio utente. Pertanto si può accedere agli indirizzi di memoria DMI attraverso di essa (e fare cose molto più brutte).

  5. Per quanto riguarda chgrpe chmod g+sdi dmidecodea Nils' risposta: Credo che questo non funzionerà come previsto, in quanto il risparmio gid con chmod g+snon rende dmidecodeutilizzare sia nuovi privilegi. dmidecodedeve chiamare setegidper impostare il suo ID di gruppo effettivo prima che possa accedervi /dev/mem. A giudicare dal suo codice sorgente, dmidecodenon lo fa.


1
Aggiunta a 3 .: per accedere all'output del kernel sui sistemi senza systemdleggere /var/log/kern.log. Se non esiste un file simile mentre il sistema è ancora in uso syslogd, prova a cercare le kern.*voci /etc/syslog.confper scoprire la sua posizione.
Ruslan,

5

Prova dmesg. Sono stato in grado di ottenere le informazioni che desideravo in questo modo con un normale account utente.


Non sono sicuro del perché sei stato votato verso il basso. Ho posto una risposta più dettagliata in base alla tua soluzione che tutti possono vedere. Penso che la tua soluzione vada bene.
Wally,

4

Stiamo usando DMIDecode per leggere informazioni da sistemi Linux remoti e non abbiamo ancora trovato una soluzione a questo. Ho registrato una chiamata nella home page di dmidecode chiedendo di questo ...

L'uso del comando dmidecode -t system dà l'errore "/ dev / mem: Autorizzazione negata" che è un problema poiché non vogliamo informazioni sulla memoria (solo produttore, modello e numero di serie).

Ho notato che il comando smbios in esecuzione su SunOS funziona bene per queste informazioni senza bisogno del privilegio di root.

Per ora ho intenzione di sostituire la nostra documentazione affermando di "utilizzare un account specifico con il privilegio meno richiesto" con "credenziali utente root".


4

lshal contiene molte delle stesse informazioni e non richiede i privilegi di root.


Non sono sicuro del motivo per cui questo è stato votato, approvandolo mi ha dato esattamente le informazioni di cui avevo bisogno lshal | grep system.productper il nome del sistema e persino il tag di servizio dell conlshal | grep smbios.system.serial
Mark Booth

2
@MarkBooth forse perché HAL è obsoleto e non spedito nelle distribuzioni moderne.
Ruslan,

lshalalla fine se ne andò completamente in RHEL7 e ora sto usando sudo cat /sys/devices/virtual/dmi/id/chassis_serialper ottenere il tag di servizio Dell, ma questo funziona solo come ho accesso cattramite sudoers.
Mark Booth,

4

Non sono sicuro del motivo per cui @mtneagle abbia ricevuto un voto negativo.

I tre elementi desiderati dall'OP sono:

Il tipo di piattaforma ( dmidecode -s system-product-name)
La versione del BIOS ( dmidecode -s bios-version)
La quantità di memoria fisica ( dmidecode -t17 | grep Size)

Possiamo ottenere ognuno di questi così:

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'

(O almeno quelli funzionano sui 4 diversi server hardware che ho e non hanno restituito in modo pulito nulla per BIOS o tipo di server su un guest Xen.)

Ho perso qualcosa di ovvio?


Aggiornamento: Grazie a @Ruslan per aver sottolineato l'ovvio che mi sono perso.

citando:

Sì tu hai. I messaggi del kernel sono memorizzati in un buffer ad anello. Quando sono state stampate troppe righe, le prime vengono eliminate.

Quindi, se la tua macchina ha funzionato per più settimane e l'hai sospesa / ripresa almeno ogni giorno, è molto probabile che le informazioni per cui cerchi qui non saranno più nel buffer.

(Ho una situazione del genere con uptime di 18 giorni qui.) Potrebbe essere meglio esaminare /var/log/kern.log

Qualcosa di simile a grep DMI: /var/log/kern.log | tail -n1


3
Sì tu hai. I messaggi del kernel sono memorizzati in un buffer ad anello. Quando sono state stampate troppe righe, le prime vengono eliminate. Quindi, se la tua macchina ha funzionato per più settimane e l'hai sospesa / ripresa almeno ogni giorno, è molto probabile che le informazioni grepper te qui non saranno più nel buffer. (Ho una situazione del genere con uptime di 18 giorni qui.) Potrebbe essere meglio esaminare /var/log/kern.log. Qualcosa del genere grep DMI: /var/log/kern.log | tail -n1.
Ruslan,

Grazie - Spero non ti dispiaccia, ho incluso il tuo commento nella mia risposta (con il merito).
wally,

2

Per ottenere la quantità totale di memoria fisica, si può analizzare /proc/meminfo, free,vmstat , ecc Si può anche analizzare il buffer dei messaggi del kernel, dato che ne parla a 0 tempo.

La versione del BIOS è più difficile, non credo che ciò sia possibile come utente non root, ma potrei sbagliarmi. È possibile che esso (e il nome del prodotto di sistema) siano esposti da qualche parte, forse in /sys/o /proc/, ma non riesco a trovare nulla.


2
Viene anche menzionato il BIOS, quindi consultare il registro del kernel o dmesgse non è stato riempito troppo. [ 0.000000] DMI: CLEVO CO. B7130 /B7130 , BIOS 6.00 08/27/2010
Riga di

cat /sys/devices/virtual/dmi/id/bios_version...Ecco'! Ma YMMV. Non tutte le architetture hanno questo percorso. x86_64 Intel dovrebbe.
Mike S,

2

I nostri servizi Linux non funzionano come root. Nello script post installazione RPM (che DOES viene eseguito come root) installiamo un file /etc/sudo.d e impostiamo alcuni dei nostri eseguibili (ad es. Per i privilegi di trasmissione in rete).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.