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
:
dmidecode -s system-product-name
)dmidecode -s bios-version
)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?
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:
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.
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.
Pour accéder à la sortie du noyau avec systemd
Run:
journalctl --quiet --system --boot SYSLOG_IDENTIFIER=kernel
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).
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.
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
.
Essayez dmesg. J'ai pu obtenir les informations que je voulais de cette façon avec un compte d'utilisateur régulier.
lshal
contient beaucoup de cette même information et ne nécessite pas de privilèges root.
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
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".
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).
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.