Ich schreibe ein Programm, das verschiedene Systeminformationen anzeigt (auf einem CentOS-System). Beispiel: Prozessortyp und -geschwindigkeit (von /proc/cpuinfo
), letzte Startzeit (berechnet von /proc/uptime
), IP-Adresse (von der ifconfig
Ausgabe) und Liste der installierten Drucker (von der lpstat
Ausgabe).
Derzeit werden mehrere Daten aus dem dmidecode
Programm abgerufen :
- Der Plattformtyp (
dmidecode -s system-product-name
) - Die BIOS - Version (
dmidecode -s bios-version
) - Die Größe des physischen Speichers (
dmidecode -t17 | grep Size
)
Diese sind nur verfügbar, wenn mein Programm als root ausgeführt wird (da sonst der dmidecode
Unterprozess mit einem /dev/mem: Permission denied
Fehler fehlschlägt ). Gibt es eine alternative Möglichkeit, diese Informationen zu erhalten, auf die ein normaler Benutzer zugreifen kann?
quelle
/sys/devices/virtual/dmi/id
. Viele plattformspezifische Informationen dort zur Verfügung. Ein praktisches Skript finden Sie unter unix.stackexchange.com/questions/75750/… . Für Systeminformationen ist Ihr anderer Satz zu gut. Es gibt viele Dienstprogramme wiefree
oder sogar ,htop
dass Sie bekommen , was Sie wollen.Ich kann DMI-Informationen als Benutzer unter lesen
/sys/class/dmi/id/
. Ohne Seriennummern (die zum Lesen Root-Rechte erfordern).Ich denke, dies ist beabsichtigtes Verhalten von Privatsphäre bewusst Kernel-Entwickler.
In Bezug auf
dmesg
:dmesg
ist ein Befehl für den Kernel - Ringpuffer zugreift. Ringpuffer impliziert, dass ältere Informationen durch neuere überschrieben werden, wenn der Puffer "überläuft". Dies ist auch das Lesen der Kernelmodul-Debug-Ausgabe, die niemals als analysierbar gedacht war.Um den Zugriff Kernel - Ausgang mit
systemd
Lauf:Zu den Antworten von david-homer und nils : Die Datei
/dev/mem
gibt nicht nur Speicherinformationen an, sondern ordnet den gesamten physischen Speicher dem Benutzerbereich zu. Daher kann man über sie auf DMI-Speicheradressen zugreifen (und noch viel schlimmere Dinge tun).In Bezug auf
chgrp
und auf die Antwortchmod g+s
vondmidecode
in nils : Ich denke, das funktioniert nicht wie vorgesehen, da das Speichern von gid with seine neuen Berechtigungenchmod g+s
nichtdmidecode
nutzt.dmidecode
hat nennensetegid
es die effektive Gruppen - ID zu setzen , bevor sie zugreifen können/dev/mem
. Dem Quellcode nach zu urteilen,dmidecode
tut das nicht.quelle
systemd
nur zu lesen/var/log/kern.log
. Wenn es keine solche Datei gibt, während das System sie noch verwendetsyslogd
, suchen Sie nachkern.*
Einträgen in/etc/syslog.conf
, um den Speicherort herauszufinden.Versuchen Sie es mit dmesg. Mit einem normalen Benutzerkonto konnte ich die gewünschten Informationen abrufen.
quelle
Wir verwenden DMIDecode, um Informationen von entfernten Linux-Systemen zu lesen, und haben noch keine Lösung dafür gefunden. Ich habe einen Anruf auf der dmidecode-Homepage angemeldet, der mich danach fragt ...
Bei Verwendung des Befehls dmidecode -t wird der Fehler "/ dev / mem: Berechtigung verweigert" ausgegeben, was ein Problem darstellt, da keine Speicherinformationen (nur Hersteller, Modell und Seriennummer) benötigt werden.
Ich stelle fest, dass der unter SunOS ausgeführte Befehl smbios für diese Informationen problemlos funktioniert, ohne dass Root-Berechtigungen erforderlich sind.
Im Moment ersetze ich unsere Dokumentation, die besagt, dass Sie "ein bestimmtes Konto mit den am wenigsten erforderlichen Berechtigungen verwenden", durch "root-Benutzeranmeldeinformationen".
quelle
lshal
enthält viele der gleichen Informationen und erfordert keine root-Rechte.quelle
lshal | grep system.product
für den Systemnamen benötigte , und sogar das Dell-Service-Tag mitlshal | grep smbios.system.serial
lshal
Ging schließlich vollständig in RHEL7 weg und ich benutze jetzt,sudo cat /sys/devices/virtual/dmi/id/chassis_serial
um an die Dell-Service-cat
Marke zu gelangen , aber das funktioniert nur, wenn ich über Sudoer Zugriff habe.Ich bin nicht sicher, warum @mtneagle runtergestimmt wurde.
Die drei Gegenstände, die das OP haben wollte, sind:
Der Plattformtyp (
dmidecode -s system-product-name
)Die BIOS-Version (
dmidecode -s bios-version
)Die Größe des physischen Speichers (
dmidecode -t17 | grep Size
)Wir können jedes von diesen so bekommen:
(Oder zumindest die, die auf den 4 verschiedenen Hardware-Servern funktionieren, die ich besitze, und auf einem Xen-Gast sauber nichts für BIOS oder Servertyp zurückgegeben haben.)
Habe ich etwas Offensichtliches verpasst?
Update: Danke an @Ruslan für den Hinweis auf die offensichtlichen Fehler, die ich verpasst habe.
Zitat:
quelle
grep
für die Sie hier sind, nicht mehr im Puffer sind. (Ich habe eine solche Situation mit einer Betriebszeit von 18 Tagen.) Vielleicht ist es besser, sie zu untersuchen/var/log/kern.log
. So etwas wiegrep DMI: /var/log/kern.log | tail -n1
.Um die Gesamtmenge des physischen Speichers zu erhalten, können Sie analysieren
/proc/meminfo
,free
,vmstat
usw. Sie können auch die Kernel - Nachrichtenpuffer analysieren, da es darüber zum Zeitpunkt 0 spricht.Die BIOS-Version ist schwieriger, ich glaube nicht, dass dies als Nicht-Root-Benutzer möglich ist, aber ich kann mich irren. Es ist möglich, dass es (und der Name des Systemprodukts) irgendwo angezeigt wird, vielleicht in
/sys/
oder/proc/
, aber ich kann nichts finden.quelle
dmesg
falls es nicht zu voll ist. Beispielzeile:[ 0.000000] DMI: CLEVO CO. B7130 /B7130 , BIOS 6.00 08/27/2010
cat /sys/devices/virtual/dmi/id/bios_version
... Voila! Aber YMMV. Nicht alle Architekturen haben diesen Weg. x86_64 sollte Intel.Unsere Linux-Dienste werden nicht als Root ausgeführt. In dem RPM-Post-Installationsskript (das als root ausgeführt wird) installieren wir eine /etc/sudo.d -Datei und setzen einige unserer ausführbaren Dateien auf setcap (z. B. für Netzwerk-Broadcast-Berechtigungen).
quelle