web-dev-qa-db-fra.com

Comment obtenir des informations DMidecode sans privilèges root?

J'écris un programme qui affiche diverses informations système (sur un système CENTOS). Par exemple, le type et la vitesse du processeur (de /proc/cpuinfo), le dernier temps de démarrage (calculé de /proc/uptime), l'adresse IP (de ifconfig sortie) et une liste des imprimantes installées (à partir de lpstat Sortie).

Actuellement, plusieurs données sont obtenues à partir du programme dmidecode:

  • Le type de plate-forme (dmidecode -s system-product-name)
  • La version du BIOS (dmidecode -s bios-version)
  • La quantité de mémoire physique (dmidecode -t17 | grep Size)

Celles-ci ne sont disponibles que si mon programme est exécuté en tant que root (car sinon la sous-processus dmidecode échoue avec un /dev/mem: Permission denied Erreur). Existe-t-il une solution alternative d'obtenir ces informations qu'un utilisateur normal peut accéder?

16
user1024

Je viens de vérifier sur mon système Centos 5 - après:

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

Il n'est toujours pas possible d'obtenir dmidecode fonctionne - le groupe KMEM n'a que des droits de lecture pour/dev/mem - il semble qu'il y ait une écriture impliquée pour accéder aux informations du BIOS.

Donc d'autres options:

  1. Utiliser sudo
  2. Utilisez d'autres sources d'informations (par exemple/proc/meminfo)
  3. Utilisez un script init qui écrit la sortie statique de DmiCode à un fichier lisible dans le monde.
4
Nils
  1. Je peux lire des informations DMI comme utilisateur sous /sys/class/dmi/id/. N'incluant pas les numéros de série (qui nécessitent des privilèges root à lire).

    Je suppose que cela est le comportement prévu par la confidentialité consciente des développeurs de noyaux.

  2. Concernant dmesg: dmesg est une commande pour accéder au tampon à anneau du noyau. La mémoire tampon d'anneau implique des informations plus anciennes sont écrasées par les plus récents lorsque le tampon est "débordant". En outre, il s'agit de la production de débogage du module de noyau qui n'a jamais été désactivée.

  3. Pour accéder à la sortie du noyau avec systemd Run:

    journalctl --quiet --system --boot SYSLOG_IDENTIFIER=kernel
    
  4. Concernant David-Homer's et nils ' réponses: le fichier /dev/mem ne donne pas simplement des informations de mémoire, mais mappe toute la mémoire physique dans l'espace utilisateur. Par conséquent, on peut accéder aux adresses de mémoire DMI à travers elle (et faire des choses beaucoup plus mauvaises).

  5. Concernant chgrp et chmod g+s de dmidecode in nils ' Réponse: Je suppose que cela ne fonctionnera pas comme prévu, car économiser gid avec chmod g+s ne fait pas dmidecode utiliser ses nouveaux privilèges. dmidecode doit appeler setegid pour définir son identifiant de groupe effectif avant d'accéder à /dev/mem. Juger de son code source, dmidecode ne le fait pas.

6
thomas

Certaines des informations présentées par dmidecode sont disponibles à /sys/devices/virtual/dmi/id.

D'autres informations peuvent être obtenues en analysant /proc/cpuinfo, /proc/meminfo ou /sys/system/node/node0/meminfo.

6
OluaJho

Essayez dmesg. J'ai pu obtenir les informations que je voulais de cette façon avec un compte d'utilisateur régulier.

5
mtneagle

lshal contient beaucoup de cette même information et ne nécessite pas de privilèges root.

4
Calvin Locklear

Je ne suis pas certain de savoir pourquoi @mtneagle a voté.

Les trois articles que l'OP recherché est:

Le type de plate-forme (dmidecode -s system-product-name)
[.____] la version du BIOS (dmidecode -s bios-version)
[.____] la quantité de mémoire physique (dmidecode -t17 | grep Size)

Nous pouvons obtenir chacun de ceux-ci donc:

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'

(Ou au moins ceux-ci travaillent sur les 4 serveurs matériels différents que j'ai, et ne rien revenaient bien pour le bios ou le type de serveur sur un invité Xen.)

Ai-je manqué quelque chose d'évident?


Mise à jour : Merci à @Ruslan pour avoir souligné l'évidence, j'ai manqué.

Citant:

Oui tu as. Les messages du noyau sont stockés dans un tampon en anneau. Lorsque trop de lignes ont été imprimées, les premiers sont supprimés.

Donc, si votre machine a fonctionné pendant plusieurs semaines et que vous avez suspendu/la repris au moins tous les jours, des fortes chances sont que les informations que vous grep pour ici ne seront plus dans le tampon.

(J'ai une telle situation avec la disponibilité de 18 jours ici.) Il est peut-être préférable de regarder /var/log/kern.log

Quelque chose comme grep DMI: /var/log/kern.log | tail -n1

4
wally

Nous utilisons DmiDecode pour lire des informations à partir de systèmes Linux distants et n'a pas encore trouvé de solution de contournement. J'ai enregistré un appel sur la page d'accueil DmiDecode en question à ce sujet ...

L'utilisation du système de commande DmiDecode -T donne l'erreur "/ dev/mem: autorisation refusée" qui est un problème car nous ne voulons pas d'informations de mémoire (juste fabricant, modèle et numéro de série).

Je remarque que la commande SMBIOS s'exécutant sur Sunos fonctionne bien pour ces informations sans avoir besoin de privilège racine.

Pour l'instant, je vais remplacer notre documentation indiquant "Utiliser un compte spécifique avec le privilège le moins requis" avec "Crédits de racine de l'utilisateur".

4
David Homer

Nos services Linux ne fonctionnent pas en tant que root. Dans le script d'installation de Post RPM (qui fonctionne en tant que root), nous installons un fichier /etc/sudo.d et SetCap quelques-uns de nos exécutables (par exemple pour les privilèges de diffusion de réseau).

2
Kezenator

Pour obtenir le montant total de la mémoire physique, vous pouvez analyser /proc/meminfo, free, vmstat, etc. Vous pouvez également analyser le tampon de message du noyau, car il en parle à 0 heure.

La version du BIOS est plus difficile, je ne crois pas que cela soit possible comme un utilisateur non root, mais je me trompe peut-être. Il est possible que cela (et le nom du produit du système) soient exposés quelque part, peut-être dans /sys/ ou /proc/, mais je ne trouve rien.

2
Chris Down