J'écris un programme qui affiche diverses informations système (sur un système CentOS). Par exemple, le type et la vitesse du processeur (à partir de /proc/cpuinfo
), la dernière heure de démarrage (calculée à partir de /proc/uptime
), l'adresse IP (à partir de la ifconfig
sortie) et une liste d'imprimantes installées (à partir de la lpstat
sortie).
Actuellement, plusieurs données sont obtenues à partir du dmidecode
programme:
- Le type de plateforme (
dmidecode -s system-product-name
) - La version du BIOS (
dmidecode -s bios-version
) - La quantité de mémoire physique (
dmidecode -t17 | grep Size
)
Ceux-ci ne sont disponibles que si mon programme est exécuté en tant que root (car sinon le dmidecode
sous - processus échoue avec une /dev/mem: Permission denied
erreur). Existe-t-il un autre moyen d'obtenir ces informations, auquel un utilisateur normal peut accéder?
la source
/sys/devices/virtual/dmi/id
. De nombreuses informations spécifiques à la plateforme y sont disponibles. Pour un script pratique, voir unix.stackexchange.com/questions/75750/… . Pour les informations système, votre autre phrase est également bonne. Il existe de nombreux utilitaires commefree
ou mêmehtop
qui peuvent vous fournir ce que vous voulez.Je peux lire les informations DMI en tant qu'utilisateur sous
/sys/class/dmi/id/
. N'inclut pas les numéros de série (qui nécessitent des privilèges root pour lire).Je suppose que c'est le comportement voulu des développeurs de noyau soucieux de la confidentialité.
Concernant
dmesg
:dmesg
est une commande pour accéder au tampon d'anneau du noyau. Le tampon en anneau implique que les informations plus anciennes sont remplacées par des nouvelles lorsque le tampon "déborde". C'est également la lecture de la sortie de débogage du module du noyau qui n'a jamais été conçue pour être analysable.Pour accéder à la sortie du noyau avec
systemd
run:Concernant les réponses de David-Homer et Nils : Le fichier
/dev/mem
ne donne pas simplement des informations sur la mémoire, mais mappe toute la mémoire physique dans l'espace utilisateur. Par conséquent, on peut accéder aux adresses mémoire DMI à travers elle (et faire des choses beaucoup plus désagréables).Concernant
chgrp
etchmod g+s
dedmidecode
dans la réponse de nils : Je suppose que cela ne fonctionnera pas comme prévu, car l'enregistrement de gid avecchmod g+s
ne fait pasdmidecode
usage de ses nouveaux privilèges.dmidecode
doit appelersetegid
pour définir son identifiant de groupe effectif avant de pouvoir y accéder/dev/mem
. À en juger par son code source,dmidecode
ne fait pas cela.la source
systemd
simplement lire/var/log/kern.log
. S'il n'y a pas un tel fichier pendant que le système est encore en cours d'utilisationsyslogd
, essayez de rechercher deskern.*
entrées/etc/syslog.conf
pour découvrir son emplacement.Essayez le dmesg. J'ai pu obtenir les informations que je voulais de cette façon avec un compte utilisateur normal.
la source
Nous utilisons DMIDecode pour lire les informations des systèmes Linux distants et nous n'avons pas encore trouvé de solution à ce problème. J'ai enregistré un appel sur la page d'accueil de dmidecode à ce sujet ...
L'utilisation de la commande dmidecode -t system donne l'erreur "/ dev / mem: Autorisation refusée" qui est un problème car nous ne voulons pas d'informations sur la mémoire (juste le fabricant, le modèle et le numéro de série).
Je remarque que la commande smbios exécutée sur SunOS fonctionne correctement pour ces informations sans avoir besoin du privilège root.
Pour l'instant, je vais remplacer notre documentation indiquant "utiliser un compte spécifique avec le privilège le moins requis" par "les informations d'identification de l'utilisateur root".
la source
lshal
contient beaucoup de ces mêmes informations et ne nécessite pas de privilèges root.la source
lshal | grep system.product
pour le nom du système, et même l'étiquette de service Dell aveclshal | grep smbios.system.serial
lshal
finalement disparu complètement dans RHEL7 et j'utilise maintenantsudo cat /sys/devices/virtual/dmi/id/chassis_serial
pour obtenir le numéro de service Dell, mais cela ne fonctionne que car j'ai accès àcat
travers sudoers.Je ne sais pas pourquoi @mtneagle a été rejeté.
Les trois éléments recherchés par le PO sont:
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 ces éléments ainsi:
(Ou du moins ceux qui fonctionnent sur les 4 serveurs matériels différents que j'ai, et n'ont rien renvoyé proprement pour le BIOS ou le type de serveur sur un invité Xen.)
Ai-je raté quelque chose d'évident?
Mise à jour: Merci à @Ruslan d'avoir souligné l'évident qui m'a manqué.
Citant:
la source
grep
ici ne soient plus dans le tampon. (J'ai une telle situation avec un temps de disponibilité de 18 jours ici.) Il peut être préférable d'examiner/var/log/kern.log
. Quelque chose commegrep DMI: /var/log/kern.log | tail -n1
.Pour obtenir le montant total de la mémoire physique, vous pouvez analyser
/proc/meminfo
,free
,vmstat
, etc. Vous pouvez également analyser le tampon des messages du noyau, car il en parle à 0 heure.La version du BIOS est plus difficile, je ne pense pas que cela soit possible en tant qu'utilisateur non root, mais je peux me tromper. Il est possible qu'il (et le nom du produit système) soient exposés quelque part, peut-être dans
/sys/
ou/proc/
, mais je ne trouve rien.la source
dmesg
s'il n'a pas été trop rempli. Exemple de ligne:[ 0.000000] DMI: CLEVO CO. B7130 /B7130 , BIOS 6.00 08/27/2010
cat /sys/devices/virtual/dmi/id/bios_version
... Voila '! Mais YMMV. Toutes les architectures n'ont pas ce chemin. Intel x86_64 devrait.Nos services Linux ne fonctionnent pas en tant que root. Dans le script de post-installation RPM (qui s'exécute en tant que root), nous installons un fichier /etc/sudo.d et définissons quelques-uns de nos exécutables (par exemple pour les privilèges de diffusion réseau).
la source